/*
 * Raphael 1.5.2 - JavaScript Vector Library
 * 
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://raphaeljs.com/license.html) license.
 */
(function () {
    function a() {
        if (a.is(arguments[0], G)) {
            var b = arguments[0],
                d = bV[m](a, b.splice(0, 3 + a.is(b[0], E))),
                e = d.set();
            for (var g = 0, h = b[w]; g < h; g++) {
                var i = b[g] || {};
                c[f](i.type) && e[L](d[i.type]().attr(i))
            } return e
        } return bV[m](a, arguments)
    }
    a.version = "1.5.2";
    var b = /[, ]+/,
        c = { circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1 },
        d = /\{(\d+)\}/g,
        e = "prototype",
        f = "hasOwnProperty",
        g = document,
        h = window,
        i = { was: Object[e][f].call(h, "Raphael"), is: h.Raphael },
        j = function () { this.customAttributes = {} },
        k,
        l = "appendChild",
        m = "apply",
        n = "concat",
        o = "createTouch" in g,
        p = "",
        q = " ",
        r = String,
        s = "split",
        t = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),
        u = { mousedown: "touchstart", mousemove: "touchmove", mouseup: "touchend" },
        v = "join",
        w = "length",
        x = r[e].toLowerCase,
        y = Math,
        z = y.max,
        A = y.min,
        B = y.abs,
        C = y.pow,
        D = y.PI,
        E = "number",
        F = "string",
        G = "array",
        H = "toString",
        I = "fill",
        J = Object[e][H],
        K = {}, 
        L = "push",
        M = /^url\(['"]?([^\)]+?)['"]?\)$/i,
        N = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
        O = { "NaN": 1, Infinity: 1, "-Infinity": 1 },
        P = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
        Q = y.round,
        R = "setAttribute",
        S = parseFloat,
        T = parseInt,
        U = " progid:DXImageTransform.Microsoft",
        V = r[e].toUpperCase,
        W = { blur: 0, "clip-rect": "0 0 1e9 1e9", cursor: "default", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: "10px \"Arial\"", "font-family": "\"Arial\"", "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0 },
        X = { along: "along", blur: E, "clip-rect": "csv", cx: E, cy: E, fill: "colour", "fill-opacity": E, "font-size": E, height: E, opacity: E, path: "path", r: E, rotation: "csv", rx: E, ry: E, scale: "csv", stroke: "colour", "stroke-opacity": E, "stroke-width": E, translation: "csv", width: E, x: E, y: E },
        Y = "replace",
        Z = /^(from|to|\d+%?)$/,
        $ = /\s*,\s*/,
        _ = { hs: 1, rg: 1 },
        ba = /,?([achlmqrstvxz]),?/gi,
        bb = /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
        bc = /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
        bd = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,
        be = function (a, b) { return a.key - b.key }; 
         a.type = h.SVGAngle || g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML";
         if (a.type == "VML") {
                 var bf = g.createElement("div"), bg;
                 bf.innerHTML = "<v:shape adj=\"1\"/>";
                 bg = bf.firstChild;
                 bg.style.behavior = "url(#default#VML)";
                 if (!(bg && typeof bg.adj == "object"))
                 return a.type = null;
             bf = null
         }
         a.svg = !(a.vml = a.type == "VML"); j[e] = a[e]; k = j[e]; a._id = 0; a._oid = 0; a.fn = {};
         a.is = function (a, b) {
             b = x.call(b);
             if (b == "finite")
                 return !O[f](+a);
             return b == "null" && a === null || b == typeof a || b == "object" && a === Object(a) || b == "array" && Array.isArray && Array.isArray(a) || J.call(a).slice(8, -1).toLowerCase() == b
         };
         a.angle = function (b, c, d, e, f, g) {
             {
                 if (f == null) {
                     var h = b - d, i = c - e;
                     if (!h && !i)
                     return 0;
                 return ((h < 0) * 180 + y.atan(-i / -h) * 180 / D + 360) % 360
                 }
                 return a.angle(b, c, f, g) - a.angle(d, e, f, g)
             }
         };
         a.rad = function (a) { return a % 360 * D / 180 };
         a.deg = function (a) { return a * 180 / D % 360 };
         a.snapTo = function (b, c, d) {
             d = a.is(d, "finite") ? d : 10;
             if (a.is(b, G)) {
                 var e = b.length;
                 while (e--)
                     if (B(b[e] - c) <= d)
                         return b[e]
             } else {
                 b = +b;
                 var f = c % b;
                 if (f < d)
                     return c - f;
                 if (f > b - d)
                     return c - f + b
             } return c
         };
         function bh() {
             var a = [], b = 0;
             for (; b < 32; b++)
             a[b] = (~(~(y.random() * 16)))[H](16);
             a[12] = 4;
             a[16] = (a[16] & 3 | 8)[H](16);
             return "r-" + a[v]("")
         }
         a.setWindow = function (a) { h = a; g = h.document };
         var bi = function (b) {
             if (a.vml) {
                 var c = /^\s+|\s+$/g, d;
                     try {
                         var e = new ActiveXObject("htmlfile");
                         e.write("<body>");
                         e.close();
                         d = e.body
                     } catch (a) {
                         d = createPopup().document.body
                     }
                     var f = d.createTextRange();
                     bi = bm(function (a) {
                         try {
                             d.style.color = r(a)[Y](c, p);
                             var b = f.queryCommandValue("ForeColor");
                             b = (b & 255) << 16 | b & 65280 | (b & 16711680) >>> 16;
                             return "#" + ("000000" + b[H](16)).slice(-6)
                         } catch (a) { return "none" }
                     })
             } else {
                 var h = g.createElement("i");
                 h.title = "Raphaël Colour Picker";
                 h.style.display = "none";
                 g.body[l](h);
                 bi = bm(function (a) {
                     h.style.color = a;
                     return g.defaultView.getComputedStyle(h, p).getPropertyValue("color")
                 })
             } return bi(b)
         },
         bj = function () {
             return "hsb(" + [this.h, this.s, this.b] + ")"
         },
         bk = function () {
             return "hsl(" + [this.h, this.s, this.l] + ")"
         },
         bl = function () { return this.hex };
        a.hsb2rgb = function (b, c, d, e) { 
            if (a.is(b, "object") && "h" in b && "s" in b && "b" in b) {
                d = b.b; c = b.s; b = b.h; e = b.o
            } return a.hsl2rgb(b, c, d / 2, e)
        };
        a.hsl2rgb = function (b, c, d, e) {
            if (a.is(b, "object") && "h" in b && "s" in b && "l" in b) { d = b.l; c = b.s; b = b.h }
            if (b > 1 || c > 1 || d > 1) { b /= 360; c /= 100; d /= 100 }
            var f = {}, g = ["r", "g", "b"], h, i, j, k, l, m;
            if (c) {
                d < 0.5 ? h = d * (1 + c) : h = d + c - d * c; i = 2 * d - h;
                for (var n = 0; n < 3; n++) {
                    j = b + 1 / 3 * -(n - 1);
                    j < 0 && j++; j > 1 && j--;
                    j * 6 < 1 ? f[g[n]] = i + (h - i) * 6 * j : j * 2 < 1 ? f[g[n]] = h : j * 3 < 2 ? f[g[n]] = i + (h - i) * (2 / 3 - j) * 6 : f[g[n]] = i
                }
        } else f = { r: d, g: d, b: d };
            f.r *= 255; f.g *= 255; f.b *= 255; f.hex = "#" + (16777216 | f.b | f.g << 8 | f.r << 16).toString(16).slice(1);
            a.is(e, "finite") && (f.opacity = e); f.toString = bl;
            return f
        };
        a.rgb2hsb = function (b, c, d) {
            if (c == null && a.is(b, "object") && "r" in b && "g" in b && "b" in b) {
                d = b.b; c = b.g; b = b.r
            }
            if (c == null && a.is(b, F)) {
                var e = a.getRGB(b); b = e.r; c = e.g; d = e.b
            }
            if (b > 1 || c > 1 || d > 1) { b /= 255; c /= 255; d /= 255 }
            var f = z(b, c, d), g = A(b, c, d), h, i, j = f; {
                if (g == f)
                    return { h: 0, s: 0, b: f, toString: bj };
                var k = f - g; i = k / f; b == f ? h = (c - d) / k : c == f ? h = 2 + (d - b) / k : h = 4 + (b - c) / k; h /= 6; h < 0 && h++; h > 1 && h--
            } return { h: h, s: i, b: j, toString: bj }
        };
        a.rgb2hsl = function (b, c, d) {
            if (c == null && a.is(b, "object") && "r" in b && "g" in b && "b" in b) {
                d = b.b; c = b.g; b = b.r
            }
            if (c == null && a.is(b, F)) {
                var e = a.getRGB(b); b = e.r; c = e.g; d = e.b
            }
            if (b > 1 || c > 1 || d > 1) { b /= 255; c /= 255; d /= 255 }
            var f = z(b, c, d), g = A(b, c, d), h, i, j = (f + g) / 2, k;
            if (g == f) k = { h: 0, s: 0, l: j };
            else {
                var l = f - g;
                i = j < 0.5 ? l / (f + g) : l / (2 - f - g);
                b == f ? h = (c - d) / l : c == f ? h = 2 + (d - b) / l : h = 4 + (b - c) / l; h /= 6; h < 0 && h++; h > 1 && h--; k = { h: h, s: i, l: j }
            }
            k.toString = bk;
            return k
        };
        a._path2string = function () {
            return this.join(",")[Y](ba, "$1")
        };
        function bm(a, b, c) {
            function d() {
                var g = Array[e].slice.call(arguments, 0), h = g[v]("►"), i = d.cache = d.cache || {}, j = d.count = d.count || [];
                if (i[f](h))
                return c ? c(i[h]) : i[h]; j[w] >= 1000 && delete i[j.shift()]; j[L](h); i[h] = a[m](b, g);
            return c ? c(i[h]) : i[h]
            }
            return d
        }
        a.getRGB = bm(function (b) {
            if (!b || !(!((b = r(b)).indexOf("-") + 1)))
                return { r: -1, g: -1, b: -1, hex: "none", error: 1 };
            if (b == "none")
                return { r: -1, g: -1, b: -1, hex: "none" };
            !(_[f](b.toLowerCase().substring(0, 2)) || b.charAt() == "#") && (b = bi(b));
            var c, d, e, g, h, i, j, k = b.match(N);
            if (k) {
                if (k[2]) {
                    g = T(k[2].substring(5), 16); e = T(k[2].substring(3, 5), 16); d = T(k[2].substring(1, 3), 16)
                }
                if (k[3]) {
                    g = T((i = k[3].charAt(3)) + i, 16); e = T((i = k[3].charAt(2)) + i, 16); d = T((i = k[3].charAt(1)) + i, 16)
                }
                if (k[4]) {
                    j = k[4][s]($); d = S(j[0]);
                    j[0].slice(-1) == "%" && (d *= 2.55);
                    e = S(j[1]);
                    j[1].slice(-1) == "%" && (e *= 2.55);
                    g = S(j[2]); j[2].slice(-1) == "%" && (g *= 2.55);
                    k[1].toLowerCase().slice(0, 4) == "rgba" && (h = S(j[3]));
                    j[3] && j[3].slice(-1) == "%" && (h /= 100)
                }
                if (k[5]) {
                    j = k[5][s]($); d = S(j[0]); j[0].slice(-1) == "%" && (d *= 2.55); e = S(j[1]);
                    j[1].slice(-1) == "%" && (e *= 2.55);
                    g = S(j[2]); j[2].slice(-1) == "%" && (g *= 2.55); (j[0].slice(-3) == "deg" || j[0].slice(-1) == "°") && (d /= 360);
                    k[1].toLowerCase().slice(0, 4) == "hsba" && (h = S(j[3]));
                    j[3] && j[3].slice(-1) == "%" && (h /= 100);
                    return a.hsb2rgb(d, e, g, h)
                }
                if (k[6]) {
                    j = k[6][s]($);
                    d = S(j[0]); j[0].slice(-1) == "%" && (d *= 2.55); e = S(j[1]);
                    j[1].slice(-1) == "%" && (e *= 2.55); g = S(j[2]); j[2].slice(-1) == "%" && (g *= 2.55);
                    (j[0].slice(-3) == "deg" || j[0].slice(-1) == "°") && (d /= 360); k[1].toLowerCase().slice(0, 4) == "hsla" && (h = S(j[3]));
                    j[3] && j[3].slice(-1) == "%" && (h /= 100);
                    return a.hsl2rgb(d, e, g, h)
                } k = { r: d, g: e, b: g }; k.hex = "#" + (16777216 | g | e << 8 | d << 16).toString(16).slice(1); a.is(h, "finite") && (k.opacity = h);
                return k
            } return { r: -1, g: -1, b: -1, hex: "none", error: 1 }
        }, a);
        a.getColor = function (a) {
            var b = this.getColor.start = this.getColor.start || { h: 0, s: 1, b: a || 0.75 },
                c = this.hsb2rgb(b.h, b.s, b.b);
            b.h += 0.075;
            if (b.h > 1) {
                b.h = 0; b.s -= 0.2; b.s <= 0 && (this.getColor.start = { h: 0, s: 1, b: b.b })
            } return c.hex
        };
        a.getColor.reset = function () { delete this.start }; 
        a.parsePathString = bm(function (b) {
            if (!b) return null;
            var c = { a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0 },
                d = []; a.is(b, G) && a.is(b[0], G) && (d = bo(b)); d[w] || r(b)[Y](bb, function (a, b, e) {
                    var f = [], g = x.call(b);
                    e[Y](bc, function (a, b) { b && f[L](+b) });
                    if (g == "m" && f[w] > 2) {
                        d[L]([b][n](f.splice(0, 2)));
                        g = "l"; b = b == "m" ? "l" : "L"
                    }
                    while (f[w] >= c[g]) { d[L]([b][n](f.splice(0, c[g]))); if (!c[g]) break }
                });
                d[H] = a._path2string;
                return d
        });
        a.findDotsAtSegment = function (a, b, c, d, e, f, g, h, i) {
            var j = 1 - i, k = C(j, 3) * a + C(j, 2) * 3 * i * c + j * 3 * i * i * e + C(i, 3) * g, l = C(j, 3) * b + C(j, 2) * 3 * i * d + j * 3 * i * i * f + C(i, 3) * h, m = a + 2 * i * (c - a) + i * i * (e - 2 * c + a), n = b + 2 * i * (d - b) + i * i * (f - 2 * d + b), o = c + 2 * i * (e - c) + i * i * (g - 2 * e + c), p = d + 2 * i * (f - d) + i * i * (h - 2 * f + d), q = (1 - i) * a + i * c, r = (1 - i) * b + i * d, s = (1 - i) * e + i * g, t = (1 - i) * f + i * h, u = 90 - y.atan((m - o) / (n - p)) * 180 / D; (m > o || n < p) && (u += 180); return { x: k, y: l, m: { x: m, y: n }, n: { x: o, y: p }, start: { x: q, y: r }, end: { x: s, y: t }, alpha: u }
        };
        var bn = bm(function (a) {
            if (!a)
                return { x: 0, y: 0, width: 0, height: 0 };
            a = bw(a);
            var b = 0, c = 0, d = [], e = [], f;
            for (var g = 0, h = a[w]; g < h; g++) {
                f = a[g];
                if (f[0] == "M") {
                    b = f[1]; c = f[2]; d[L](b); e[L](c)
                } else {
                    var i = bv(b, c, f[1], f[2], f[3], f[4], f[5], f[6]); d = d[n](i.min.x, i.max.x); e = e[n](i.min.y, i.max.y); b = f[5]; c = f[6]
                }
            }
            var j = A[m](0, d), k = A[m](0, e);
            return { x: j, y: k, width: z[m](0, d) - j, height: z[m](0, e) - k }
        }),
        bo = function (b) {
            var c = [];
            if (!a.is(b, G) || !a.is(b && b[0], G))
                b = a.parsePathString(b);
            for (var d = 0, e = b[w]; d < e; d++) {
                c[d] = [];
                for (var f = 0, g = b[d][w]; f < g; f++)
                    c[d][f] = b[d][f]
            }
            c[H] = a._path2string;
            return c
        },
        bp = bm(function (b) {
            if (!a.is(b, G) || !a.is(b && b[0], G))
                b = a.parsePathString(b);
            var c = [], d = 0, e = 0, f = 0, g = 0, h = 0;
            if (b[0][0] == "M") {
                d = b[0][1]; e = b[0][2]; f = d; g = e; h++; c[L](["M", d, e])
            }
            for (var i = h, j = b[w]; i < j; i++) {
                var k = c[i] = [], l = b[i];
                if (l[0] != x.call(l[0])) {
                    k[0] = x.call(l[0]);
                    switch (k[0]) {
                        case "a": k[1] = l[1]; k[2] = l[2]; k[3] = l[3]; k[4] = l[4]; k[5] = l[5]; k[6] = +(l[6] - d).toFixed(3); k[7] = +(l[7] - e).toFixed(3); break;
                        case "v": k[1] = +(l[1] - e).toFixed(3); break;
                        case "m": f = l[1]; g = l[2];
                        default:
                            for (var m = 1, n = l[w]; m < n; m++) k[m] = +(l[m] - (m % 2 ? d : e)).toFixed(3)
                    }
                } else {
                    k = c[i] = [];
                    if (l[0] == "m") {
                        f = l[1] + d; g = l[2] + e
                    }
                    for (var o = 0, p = l[w]; o < p; o++)
                        c[i][o] = l[o]
                }
                var q = c[i][w];
                switch (c[i][0]) {
                    case "z": d = f; e = g; break;
                    case "h": d += +c[i][q - 1]; break;
                    case "v": e += +c[i][q - 1]; break;
                    default:
                        d += +c[i][q - 2]; e += +c[i][q - 1]
                }
            }
            c[H] = a._path2string;
            return c
        }, 0, bo),
        bq = bm(function (b) {
            if (!a.is(b, G) || !a.is(b && b[0], G))
                b = a.parsePathString(b);
            var c = [], d = 0, e = 0, f = 0, g = 0, h = 0;
            if (b[0][0] == "M") {
                d = +b[0][1]; e = +b[0][2]; f = d; g = e; h++; c[0] = ["M", d, e]
            }
            for (var i = h, j = b[w]; i < j; i++) {
                var k = c[i] = [], l = b[i];
                if (l[0] != V.call(l[0])) {
                    k[0] = V.call(l[0]);
                    switch (k[0]) {
                        case "A": k[1] = l[1]; k[2] = l[2]; k[3] = l[3]; k[4] = l[4]; k[5] = l[5]; k[6] = +(l[6] + d); k[7] = +(l[7] + e); break;
                        case "V": k[1] = +l[1] + e; break;
                        case "H": k[1] = +l[1] + d; break;
                        case "M": f = +l[1] + d; g = +l[2] + e;
                        default:
                            for (var m = 1, n = l[w]; m < n; m++) k[m] = +l[m] + (m % 2 ? d : e)
                    }
            } else
                for (var o = 0, p = l[w]; o < p; o++) c[i][o] = l[o];
                switch (k[0]) {
                    case "Z": d = f; e = g; break;
                    case "H": d = k[1]; break;
                    case "V": e = k[1]; break;
                    case "M": f = c[i][c[i][w] - 2];
                        g = c[i][c[i][w] - 1];
                    default: d = c[i][c[i][w] - 2]; e = c[i][c[i][w] - 1]
                }
            }
            c[H] = a._path2string;
            return c
        }, null, bo),
        br = function (a, b, c, d) {
            return [a, b, c, d, c, d]
        },
        bs = function (a, b, c, d, e, f) {
            var g = 1 / 3, h = 2 / 3;
            return [g * a + h * c, g * b + h * d, g * e + h * c, g * f + h * d, e, f]
        },
        bt = function (a, b, c, d, e, f, g, h, i, j) {
            var k = D * 120 / 180, l = D / 180 * (+e || 0), m = [], o,
                p = bm(function (a, b, c) {
                    var d = a * y.cos(c) - b * y.sin(c), e = a * y.sin(c) + b * y.cos(c);
                    return { x: d, y: e }
                });
            if (j) { G = j[0]; H = j[1]; E = j[2]; F = j[3] }
                else {
                    o = p(a, b, -l); a = o.x; b = o.y; o = p(h, i, -l); h = o.x; i = o.y;
                    var q = y.cos(D / 180 * e), r = y.sin(D / 180 * e), t = (a - h) / 2, u = (b - i) / 2, x = t * t / (c * c) + u * u / (d * d);
                    if (x > 1) {
                        x = y.sqrt(x); c = x * c; d = x * d
                    }
                    var z = c * c, A = d * d,
                        C = (f == g ? -1 : 1) * y.sqrt(B((z * A - z * u * u - A * t * t) / (z * u * u + A * t * t))),
                        E = C * c * u / d + (a + h) / 2, F = C * -d * t / c + (b + i) / 2, G = y.asin(((b - F) / d).toFixed(9)),
                        H = y.asin(((i - F) / d).toFixed(9));
                        G = a < E ? D - G : G; H = h < E ? D - H : H; G < 0 && (G = D * 2 + G); H < 0 && (H = D * 2 + H); g && G > H && (G = G - D * 2); !g && H > G && (H = H - D * 2)
            }
            var I = H - G;
            if (B(I) > k) {
                var J = H, K = h, L = i; H = G + k * (g && H > G ? 1 : -1); h = E + c * y.cos(H); i = F + d * y.sin(H); m = bt(h, i, c, d, e, 0, g, K, L, [H, J, E, F])
            }
            I = H - G;
            var M = y.cos(G),
                N = y.sin(G),
                O = y.cos(H),
                P = y.sin(H),
                Q = y.tan(I / 4),
                R = 4 / 3 * c * Q,
                S = 4 / 3 * d * Q,
                T = [a, b],
                U = [a + R * N, b - S * M],
                V = [h + R * P, i - S * O],
                W = [h, i]; U[0] = 2 * T[0] - U[0];
                U[1] = 2 * T[1] - U[1];
                {
                    if (j)
                        return [U, V, W][n](m);
                    m = [U, V, W][n](m)[v]()[s](",");
                    var X = [];
                    for (var Y = 0, Z = m[w]; Y < Z; Y++)
                        X[Y] = Y % 2 ? p(m[Y - 1], m[Y], l).y : p(m[Y], m[Y + 1], l).x;
                    return X
                }
        },
        bu = function (a, b, c, d, e, f, g, h, i) {
            var j = 1 - i;
            return { x: C(j, 3) * a + C(j, 2) * 3 * i * c + j * 3 * i * i * e + C(i, 3) * g, y: C(j, 3) * b + C(j, 2) * 3 * i * d + j * 3 * i * i * f + C(i, 3) * h }
        },
        bv = bm(function (a, b, c, d, e, f, g, h) {
            var i = e - 2 * c + a - (g - 2 * e + c),
                j = 2 * (c - a) - 2 * (e - c),
                k = a - c, l = (-j + y.sqrt(j * j - 4 * i * k)) / 2 / i, n = (-j - y.sqrt(j * j - 4 * i * k)) / 2 / i,
                o = [b, h],
                p = [a, g], q; B(l) > "1e12" && (l = 0.5); B(n) > "1e12" && (n = 0.5);
                if (l > 0 && l < 1) {
                    q = bu(a, b, c, d, e, f, g, h, l); p[L](q.x); o[L](q.y)
                }
                if (n > 0 && n < 1) {
                    q = bu(a, b, c, d, e, f, g, h, n); p[L](q.x); o[L](q.y)
                }
                i = f - 2 * d + b - (h - 2 * f + d);
                j = 2 * (d - b) - 2 * (f - d);
                k = b - d; l = (-j + y.sqrt(j * j - 4 * i * k)) / 2 / i;
                n = (-j - y.sqrt(j * j - 4 * i * k)) / 2 / i;
                B(l) > "1e12" && (l = 0.5);
                B(n) > "1e12" && (n = 0.5);
                if (l > 0 && l < 1) {
                    q = bu(a, b, c, d, e, f, g, h, l); p[L](q.x); o[L](q.y)
                }
                if (n > 0 && n < 1) {
                    q = bu(a, b, c, d, e, f, g, h, n); p[L](q.x); o[L](q.y)
                }
                return { min: { x: A[m](0, p), y: A[m](0, o) }, max: { x: z[m](0, p), y: z[m](0, o) } }
        }),
        bw = bm(function (a, b) {
            var c = bq(a),
                d = b && bq(b),
                e = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null },
                f = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null },
                g = function (a, b) {
                    var c, d;
                    if (!a)
                    return ["C", b.x, b.y, b.x, b.y, b.x, b.y];
                    !(a[0] in { T: 1, Q: 1 }) && (b.qx = b.qy = null);
                    switch (a[0]) {
                        case "M": b.X = a[1]; b.Y = a[2]; break;
                        case "A": a = ["C"][n](bt[m](0, [b.x, b.y][n](a.slice(1)))); break;
                        case "S": c = b.x + (b.x - (b.bx || b.x)); d = b.y + (b.y - (b.by || b.y)); a = ["C", c, d][n](a.slice(1)); break;
                        case "T": b.qx = b.x + (b.x - (b.qx || b.x)); b.qy = b.y + (b.y - (b.qy || b.y)); a = ["C"][n](bs(b.x, b.y, b.qx, b.qy, a[1], a[2])); break;
                        case "Q": b.qx = a[1]; b.qy = a[2]; a = ["C"][n](bs(b.x, b.y, a[1], a[2], a[3], a[4])); break;
                        case "L": a = ["C"][n](br(b.x, b.y, a[1], a[2])); break;
                        case "H": a = ["C"][n](br(b.x, b.y, a[1], b.y)); break;
                        case "V": a = ["C"][n](br(b.x, b.y, b.x, a[1])); break;
                        case "Z": a = ["C"][n](br(b.x, b.y, b.X, b.Y)); break
                    }
                    return a
                },
                h = function (a, b) {
                    if (a[b][w] > 7) {
                        a[b].shift();
                        var e = a[b];
                        while (e[w])
                            a.splice(b++, 0, ["C"][n](e.splice(0, 6)));
                        a.splice(b, 1);
                        k = z(c[w], d && d[w] || 0)
                    }
                },
                i = function (a, b, e, f, g) {
                    if (a && b && a[g][0] == "M" && b[g][0] != "M") {
                        b.splice(g, 0, ["M", f.x, f.y]);
                        e.bx = 0;
                        e.by = 0;
                        e.x = a[g][1];
                        e.y = a[g][2];
                        k = z(c[w], d && d[w] || 0)
                    }
                };
            for (var j = 0, k = z(c[w], d && d[w] || 0) ; j < k; j++) {
                c[j] = g(c[j], e); h(c, j); d && (d[j] = g(d[j], f)); d && h(d, j); i(c, d, e, f, j); i(d, c, f, e, j);
                var l = c[j], o = d && d[j], p = l[w], q = d && o[w];
                e.x = l[p - 2]; e.y = l[p - 1]; e.bx = S(l[p - 4]) || e.x; e.by = S(l[p - 3]) || e.y; f.bx = d && (S(o[q - 4]) || f.x);
                f.by = d && (S(o[q - 3]) || f.y); f.x = d && o[q - 2]; f.y = d && o[q - 1]
            }
            return d ? [c, d] : c
        }, null, bo),
        bx = bm(function (b) {
            var c = [];
            for (var d = 0, e = b[w]; d < e; d++) {
                var f = {},
                    g = b[d].match(/^([^:]*):?([\d\.]*)/);
                f.color = a.getRGB(g[1]);
                if (f.color.error)
                    return null;
                f.color = f.color.hex; g[2] && (f.offset = g[2] + "%"); c[L](f)
            }
            for (d = 1, e = c[w] - 1; d < e; d++) {
                if (!c[d].offset) {
                    var h = S(c[d - 1].offset || 0), i = 0;
                    for (var j = d + 1; j < e; j++) {
                        if (c[j].offset) { i = c[j].offset; break }
                    }
                    if (!i) {
                        i = 100; j = e
                    }
                    i = S(i);
                    var k = (i - h) / (j - d + 1);
                    for (; d < j; d++) {
                        h += k; c[d].offset = h + "%"
                    }
                }
            }
            return c
        }), 
        by = function (b, c, d, e) {
            var f;
            if (a.is(b, F) || a.is(b, "object")) {
                f = a.is(b, F) ? g.getElementById(b) : b;
                if (f.tagName)
                    return c == null ? {
                        container: f, width: f.style.pixelWidth || f.offsetWidth, height: f.style.pixelHeight || f.offsetHeight
                    } : { container: f, width: c, height: d }
            } else
                return { container: 1, x: b, y: c, width: d, height: e }
        },
        bz = function (a, b) {
            var c = this;
            for (var d in b) {
                if (b[f](d) && !(d in a))
                    switch (typeof b[d]) {
                        case "function": (function (b) {
                            a[d] = a === c ? b : function () { return b[m](c, arguments) }
                        })(b[d]); break;
                        case "object": a[d] = a[d] || {}; bz.call(this, a[d], b[d]); break;
                        default: a[d] = b[d]; break
                    }
            }
        }, 
        bA = function (a, b) {
            a == b.top && (b.top = a.prev);
            a == b.bottom && (b.bottom = a.next);
            a.next && (a.next.prev = a.prev); a.prev && (a.prev.next = a.next)
        },
        bB = function (a, b) {
            if (b.top === a)
                return;
            bA(a, b); a.next = null; a.prev = b.top; b.top.next = a; b.top = a
        },
        bC = function (a, b) {
            if (b.bottom === a)
                return; bA(a, b);
            a.next = b.bottom; a.prev = null; b.bottom.prev = a; b.bottom = a
        },
        bD = function (a, b, c) {
            bA(a, c); b == c.top && (c.top = a); b.next && (b.next.prev = a); a.next = b.next; a.prev = b; b.next = a
        },
        bE = function (a, b, c) {
            bA(a, c); b == c.bottom && (c.bottom = a); b.prev && (b.prev.next = a); a.prev = b.prev; b.prev = a; a.next = b
        },
        bF = function (a) {
            return function () {
                throw new Error("Raphaël: you are calling to method “" + a + "” of removed object")
            }
        };
        a.pathToRelative = bp;
        if (a.svg) {
            k.svgns = "http://www.w3.org/2000/svg";
            k.xlink = "http://www.w3.org/1999/xlink";
            Q = function (a) {
                return +a + (~(~a) === a) * 0.5
            };
            var bG = function (a, b) {
                if (b)
                    for (var c in b)
                        b[f](c) && a[R](c, r(b[c]));
                else {
                    a = g.createElementNS(k.svgns, a);
                    a.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
                    return a
                }
            };
            a[H] = function () {
                return "Your browser supports SVG.\nYou are running Raphaël " + this.version
            };
            var bH = function (a, b) {
                var c = bG("path");
                b.canvas && b.canvas[l](c);
                var d = new bN(c, b); d.type = "path"; bK(d, { fill: "none", stroke: "#000", path: a });
                return d
            },
            bI = function (a, b, c) {
                var d = "linear", e = 0.5, f = 0.5, h = a.style;
                b = r(b)[Y](bd, function (a, b, c) {
                    d = "radial";
                    if (b && c) {
                        e = S(b); f = S(c);
                        var g = (f > 0.5) * 2 - 1; C(e - 0.5, 2) + C(f - 0.5, 2) > 0.25 && (f = y.sqrt(0.25 - C(e - 0.5, 2)) * g + 0.5) && f != 0.5 && (f = f.toFixed(5) - 0.00001 * g)
                    }
                    return p
                });
                b = b[s](/\s*\-\s*/);
                if (d == "linear") {
                    var i = b.shift(); i = -S(i);
                    if (isNaN(i))
                        return null;
                    var j = [0, 0, y.cos(i * D / 180), y.sin(i * D / 180)], k = 1 / (z(B(j[2]), B(j[3])) || 1);
                    j[2] *= k; j[3] *= k;
                    if (j[2] < 0) { j[0] = -j[2]; j[2] = 0 }
                    if (j[3] < 0) { j[1] = -j[3]; j[3] = 0 }
                }
                var m = bx(b);
                if (!m)
                return null;
                var n = a.getAttribute(I); n = n.match(/^url\(#(.*)\)$/); n && c.defs.removeChild(g.getElementById(n[1]));
                var o = bG(d + "Gradient"); o.id = bh(); bG(o, d == "radial" ? { fx: e, fy: f } : { x1: j[0], y1: j[1], x2: j[2], y2: j[3] }); c.defs[l](o);
                for (var q = 0, t = m[w]; q < t; q++) {
                    var u = bG("stop"); bG(u, {
                        offset: m[q].offset ? m[q].offset : q ? "100%" : "0%", "stop-color": m[q].color || "#fff"
                    }); o[l](u)
                }
                bG(a, {
                    fill: "url(#" + o.id + ")", opacity: 1, "fill-opacity": 1
                });
                h.fill = p; h.opacity = 1; h.fillOpacity = 1;
                return 1
            },
            bJ = function (b) {
                var c = b.getBBox(); bG(b.pattern, {
                    patternTransform: a.format("translate({0},{1})", c.x, c.y)
                })
            },
            bK = function (c, d) {
                var e = {
                    "": [0], none: [0], "-": [3, 1], ".": [1, 1], "-.": [3, 1, 1, 1], "-..": [3, 1, 1, 1, 1, 1], ". ": [1, 3], "- ": [4, 3], "--": [8, 3], "- .": [4, 3, 1, 3], "--.": [8, 3, 1, 3], "--..": [8, 3, 1, 3, 1, 3]
                },
                h = c.node, i = c.attrs, j = c.rotate(),
                k = function (a, b) {
                    b = e[x.call(b)];
                    if (b) {
                        var c = a.attrs["stroke-width"] || "1", f = ({ round: c, square: c, butt: 0 })[a.attrs["stroke-linecap"] || d["stroke-linecap"]] || 0, g = [], i = b[w];
                        while (i--)
                            g[i] = b[i] * c + (i % 2 ? 1 : -1) * f;
                    bG(h, { "stroke-dasharray": g[v](",") })
                    }
                };
                d[f]("rotation") && (j = d.rotation);
                var m = r(j)[s](b);
                if (m.length - 1) { m[1] = +m[1]; m[2] = +m[2] }
            else m = null;
                S(j) && c.rotate(0, true);
                for (var n in d) {
                    if (d[f](n)) {
                        if (!W[f](n)) continue;
                        var o = d[n]; i[n] = o;
                        switch (n) {
                            case "blur": c.blur(o); break;
                            case "rotation": c.rotate(o, true); break;
                            case "href":
                            case "title":
                            case "target":
                                var t = h.parentNode;
                                if (x.call(t.tagName) != "a") {
                                    var u = bG("a");
                                    t.insertBefore(u, h); u[l](h); t = u
                                }
                                n == "target" && o == "blank" ? t.setAttributeNS(c.paper.xlink, "show", "new") : t.setAttributeNS(c.paper.xlink, n, o); break;
                            case "cursor": h.style.cursor = o; break;
                            case "clip-rect":
                                var y = r(o)[s](b);
                                if (y[w] == 4) {
                                    c.clip && c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);
                                    var z = bG("clipPath"), A = bG("rect");
                                    z.id = bh();
                                    bG(A, {
                                        x: y[0], y: y[1], width: y[2], height: y[3]
                                    });
                                    z[l](A);
                                    c.paper.defs[l](z);
                                    bG(h, {
                                        "clip-path": "url(#" + z.id + ")"
                                    });
                                    c.clip = A
                                }
                                if (!o) {
                                    var B = g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g, p)); B && B.parentNode.removeChild(B); bG(h, { "clip-path": p }); delete c.clip
                                } break;
                            case "path": c.type == "path" && bG(h, { d: o ? i.path = bq(o) : "M0,0" }); break;
                            case "width":
                                h[R](n, o);
                                if (i.fx) { n = "x"; o = i.x } else break;
                            case "x": i.fx && (o = -i.x - (i.width || 0));
                            case "rx": if (n == "rx" && c.type == "rect") break;
                            case "cx": m && (n == "x" || n == "cx") && (m[1] += o - i[n]); h[R](n, o); c.pattern && bJ(c); break;
                            case "height": h[R](n, o); if (i.fy) { n = "y"; o = i.y } else break;
                            case "y": i.fy && (o = -i.y - (i.height || 0));
                            case "ry": if (n == "ry" && c.type == "rect") break;
                            case "cy": m && (n == "y" || n == "cy") && (m[2] += o - i[n]); h[R](n, o); c.pattern && bJ(c); break;
                            case "r": c.type == "rect" ? bG(h, { rx: o, ry: o }) : h[R](n, o); break;
                            case "src": c.type == "image" && h.setAttributeNS(c.paper.xlink, "href", o); break;
                            case "stroke-width": h.style.strokeWidth = o; h[R](n, o); i["stroke-dasharray"] && k(c, i["stroke-dasharray"]); break;
                            case "stroke-dasharray": k(c, o); break;
                            case "translation":
                                var C = r(o)[s](b); C[0] = +C[0] || 0; C[1] = +C[1] || 0;
                                if (m) { m[1] += C[0]; m[2] += C[1] } cz.call(c, C[0], C[1]); break;
                            case "scale": C = r(o)[s](b); c.scale(+C[0] || 1, +C[1] || +C[0] || 1, isNaN(S(C[2])) ? null : +C[2], isNaN(S(C[3])) ? null : +C[3]); break;
                            case I: var D = r(o).match(M);
                                if (D) {
                                    z = bG("pattern");
                                    var E = bG("image"); z.id = bh(); bG(z, { x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1 });
                                    bG(E, { x: 0, y: 0 });
                                    E.setAttributeNS(c.paper.xlink, "href", D[1]); z[l](E);
                                    var F = g.createElement("img"); F.style.cssText = "position:absolute;left:-9999em;top-9999em";
                                    F.onload = function () {
                                        bG(z, {
                                            width: this.offsetWidth, height: this.offsetHeight
                                        });
                                        bG(E, { width: this.offsetWidth, height: this.offsetHeight });
                                        g.body.removeChild(this);
                                        c.paper.safari()
                                    };
                                    g.body[l](F); F.src = D[1]; c.paper.defs[l](z); h.style.fill = "url(#" + z.id + ")"; bG(h, { fill: "url(#" + z.id + ")" }); c.pattern = z; c.pattern && bJ(c); break
                                }
                                var G = a.getRGB(o);
                                if (G.error)
                                    if ((({ circle: 1, ellipse: 1 })[f](c.type) || r(o).charAt() != "r") && bI(h, o, c.paper)) {
                                        i.gradient = o; i.fill = "none"; break
                            }
                            else {
                                        delete d.gradient;
                                        delete i.gradient; !a.is(i.opacity, "undefined") && a.is(d.opacity, "undefined") && bG(h, { opacity: i.opacity }); !a.is(i["fill-opacity"], "undefined") && a.is(d["fill-opacity"], "undefined") && bG(h, { "fill-opacity": i["fill-opacity"] })
                                    }
                                G[f]("opacity") && bG(h, {
                                    "fill-opacity": G.opacity > 1 ? G.opacity / 100 : G.opacity
                                });
                            case "stroke": G = a.getRGB(o); h[R](n, G.hex); n == "stroke" && G[f]("opacity") && bG(h, { "stroke-opacity": G.opacity > 1 ? G.opacity / 100 : G.opacity }); break;
                            case "gradient": (({ circle: 1, ellipse: 1 })[f](c.type) || r(o).charAt() != "r") && bI(h, o, c.paper); break;
                            case "opacity": i.gradient && !i[f]("stroke-opacity") && bG(h, { "stroke-opacity": o > 1 ? o / 100 : o });
                            case "fill-opacity":
                                if (i.gradient) {
                                    var H = g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g, p));
                                    if (H) { var J = H.getElementsByTagName("stop"); J[J[w] - 1][R]("stop-opacity", o) } break
                                }
                            default:
                                n == "font-size" && (o = T(o, 10) + "px");
                                var K = n[Y](/(\-.)/g, function (a) { return V.call(a.substring(1)) }); h.style[K] = o; h[R](n, o); break
                        }
                    }
                }
                bM(c, d); m ? c.rotate(m.join(q)) : S(j) && c.rotate(j, true)
            },
            bL = 1.2,
            bM = function (b, c) {
                if (b.type != "text" || !(c[f]("text") || c[f]("font") || c[f]("font-size") || c[f]("x") || c[f]("y"))) return;
                var d = b.attrs, e = b.node, h = e.firstChild ? T(g.defaultView.getComputedStyle(e.firstChild, p).getPropertyValue("font-size"), 10) : 10;
                if (c[f]("text")) {
                    d.text = c.text;
                    while (e.firstChild) e.removeChild(e.firstChild);
                    var i = r(c.text)[s]("\n");
                    for (var j = 0, k = i[w]; j < k; j++)
                        if (i[j]) {
                            var m = bG("tspan"); j && bG(m, { dy: h * bL, x: d.x }); m[l](g.createTextNode(i[j])); e[l](m)
                        }
                }
                else {
                    i = e.getElementsByTagName("tspan");
                    for (j = 0, k = i[w]; j < k; j++)
                        j && bG(i[j], { dy: h * bL, x: d.x })
                }
                bG(e, { y: d.y });
                var n = b.getBBox(), o = d.y - (n.y + n.height / 2); o && a.is(o, "finite") && bG(e, { y: d.y + o })
            },
            bN = function (b, c) {
                var d = 0, e = 0; this[0] = b;
                this.id = a._oid++;
                this.node = b;
                b.raphael = this;
                this.paper = c;
                this.attrs = this.attrs || {};
                this.transformations = [];
                this._ = { tx: 0, ty: 0, rt: { deg: 0, cx: 0, cy: 0 }, sx: 1, sy: 1 }; !c.bottom && (c.bottom = this);
                this.prev = c.top; c.top && (c.top.next = this);
                c.top = this;
                this.next = null
            },
            bO = bN[e];
            bN[e].rotate = function (c, d, e) {
                if (this.removed) return this;
                if (c == null) {
                    if (this._.rt.cx)
                        return [this._.rt.deg, this._.rt.cx, this._.rt.cy][v](q);
                    return this._.rt.deg
                }
                var f = this.getBBox();
                c = r(c)[s](b);
                if (c[w] - 1) {
                    d = S(c[1]); e = S(c[2])
                }
                c = S(c[0]);
                d != null && d !== false ? this._.rt.deg = c : this._.rt.deg += c; e == null && (d = null);
                this._.rt.cx = d;
                this._.rt.cy = e; d = d == null ? f.x + f.width / 2 : d; e = e == null ? f.y + f.height / 2 : e;
                if (this._.rt.deg) {
                    this.transformations[0] = a.format("rotate({0} {1} {2})", this._.rt.deg, d, e);
                    this.clip && bG(this.clip, { transform: a.format("rotate({0} {1} {2})", -this._.rt.deg, d, e) })
                } else {
                    this.transformations[0] = p; this.clip && bG(this.clip, { transform: p })
                }
                bG(this.node, { transform: this.transformations[v](q) });
                return this
            };
            bN[e].hide = function () {
                !this.removed && (this.node.style.display = "none");
                return this
            };
            bN[e].show = function () {
                !this.removed && (this.node.style.display = ""); return this
            };
            bN[e].remove = function () {
                if (this.removed) return;
                bA(this, this.paper);
                this.node.parentNode.removeChild(this.node);
                for (var a in this)
                    delete this[a];
                this.removed = true
            };
            bN[e].getBBox = function () {
                if (this.removed)
                    return this;
                if (this.type == "path")
                    return bn(this.attrs.path);
                if (this.node.style.display == "none") {
                    this.show(); var a = true
                }
                var b = {};
                try {
                    b = this.node.getBBox()
                } catch (a) {
                } finally {
                    b = b || {}
                }
                if (this.type == "text") {
                    b = { x: b.x, y: Infinity, width: 0, height: 0 };
                    for (var c = 0, d = this.node.getNumberOfChars() ; c < d; c++) {
                        var e = this.node.getExtentOfChar(c);
                        e.y < b.y && (b.y = e.y);
                        e.y + e.height - b.y > b.height && (b.height = e.y + e.height - b.y); e.x + e.width - b.x > b.width && (b.width = e.x + e.width - b.x)
                    }
                }
                a && this.hide();
                return b
            };
            bN[e].attr = function (b, c) {
                if (this.removed)
                    return this;
                if (b == null) {
                    var d = {};
                    for (var e in this.attrs)
                        this.attrs[f](e) && (d[e] = this.attrs[e]);
                    this._.rt.deg && (d.rotation = this.rotate());
                    (this._.sx != 1 || this._.sy != 1) && (d.scale = this.scale());
                    d.gradient && d.fill == "none" && (d.fill = d.gradient) && delete d.gradient;
                    return d
                }
                if (c == null && a.is(b, F)) {
                    if (b == "translation")
                        return cz.call(this);
                    if (b == "rotation")
                        return this.rotate();
                    if (b == "scale")
                        return this.scale();
                    if (b == I && this.attrs.fill == "none" && this.attrs.gradient)
                        return this.attrs.gradient;
                    return this.attrs[b]
                }
                if (c == null && a.is(b, G)) {
                    var g = {};
                    for (var h = 0, i = b.length; h < i; h++)
                        g[b[h]] = this.attr(b[h]);
                    return g
                }
                if (c != null) {
                    var j = {}; j[b] = c
                } else b != null && a.is(b, "object") && (j = b);
                for (var k in this.paper.customAttributes)
                    if (this.paper.customAttributes[f](k) && j[f](k) && a.is(this.paper.customAttributes[k], "function")) {
                        var l = this.paper.customAttributes[k].apply(this, [][n](j[k])); this.attrs[k] = j[k];
                        for (var m in l)
                            l[f](m) && (j[m] = l[m])
                    }
                bK(this, j);
                return this
            };
            bN[e].toFront = function () {
                if (this.removed)
                    return this;
                this.node.parentNode[l](this.node);
                var a = this.paper;
                a.top != this && bB(this, a);
                return this
            };
            bN[e].toBack = function () {
                if (this.removed)
                    return this;
                if (this.node.parentNode.firstChild != this.node) {
                    this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); bC(this, this.paper);
                    var a = this.paper
                }
                return this
            };
            bN[e].insertAfter = function (a) {
                if (this.removed)
                    return this;
                var b = a.node || a[a.length - 1].node;
                b.nextSibling ? b.parentNode.insertBefore(this.node, b.nextSibling) : b.parentNode[l](this.node); bD(this, a, this.paper);
                return this
            };
            bN[e].insertBefore = function (a) {
                if (this.removed)
                    return this;
                var b = a.node || a[0].node; b.parentNode.insertBefore(this.node, b); bE(this, a, this.paper);
                return this
            };
            bN[e].blur = function (a) {
                var b = this;
                if (+a !== 0) {
                    var c = bG("filter"), d = bG("feGaussianBlur");
                    b.attrs.blur = a; c.id = bh(); bG(d, { stdDeviation: +a || 1.5 });
                    c.appendChild(d); b.paper.defs.appendChild(c); b._blur = c;
                    bG(b.node, { filter: "url(#" + c.id + ")" })
                } else {
                    if (b._blur) {
                        b._blur.parentNode.removeChild(b._blur); delete b._blur; delete b.attrs.blur
                    } b.node.removeAttribute("filter")
                }
            };
            var bP = function (a, b, c, d) {
                var e = bG("circle"); a.canvas && a.canvas[l](e);
                var f = new bN(e, a);
                f.attrs = { cx: b, cy: c, r: d, fill: "none", stroke: "#000" };
                f.type = "circle"; bG(e, f.attrs);
                return f
            },
            bQ = function (a, b, c, d, e, f) {
                var g = bG("rect");
                a.canvas && a.canvas[l](g);
                var h = new bN(g, a);
                h.attrs = { x: b, y: c, width: d, height: e, r: f || 0, rx: f || 0, ry: f || 0, fill: "none", stroke: "#000" };
                h.type = "rect";
                bG(g, h.attrs);
                return h
            },
            bR = function (a, b, c, d, e) {
                var f = bG("ellipse");
                a.canvas && a.canvas[l](f);
                var g = new bN(f, a);
                g.attrs = { cx: b, cy: c, rx: d, ry: e, fill: "none", stroke: "#000" };
                g.type = "ellipse";
                bG(f, g.attrs);
                return g
            },
            bS = function (a, b, c, d, e, f) {
                var g = bG("image");
                bG(g, { x: c, y: d, width: e, height: f, preserveAspectRatio: "none" });
                g.setAttributeNS(a.xlink, "href", b); a.canvas && a.canvas[l](g);
                var h = new bN(g, a);
                h.attrs = { x: c, y: d, width: e, height: f, src: b };
                h.type = "image";
                return h
            },
            bT = function (a, b, c, d) {
                var e = bG("text");
                bG(e, { x: b, y: c, "text-anchor": "middle" });
                a.canvas && a.canvas[l](e);
                var f = new bN(e, a);
                f.attrs = {
                    x: b, y: c, "text-anchor": "middle", text: d, font: W.font, stroke: "none", fill: "#000"
                };
                f.type = "text";
                bK(f, f.attrs);
                return f
            },
            bU = function (a, b) {
                this.width = a || this.width; this.height = b || this.height;
                this.canvas[R]("width", this.width);
                this.canvas[R]("height", this.height);
                return this
            },
            bV = function () {
                var b = by[m](0, arguments), c = b && b.container, d = b.x, e = b.y, f = b.width, h = b.height;
                if (!c)
                throw new Error("SVG container not found.");
                var i = bG("svg"); d = d || 0; e = e || 0; f = f || 512; h = h || 342; bG(i, { xmlns: "http://www.w3.org/2000/svg", version: 1.1, width: f, height: h });
                if (c == 1) {
                    i.style.cssText = "position:absolute;left:" + d + "px;top:" + e + "px"; g.body[l](i)
            } else
                c.firstChild ? c.insertBefore(i, c.firstChild) : c[l](i); c = new j; c.width = f; c.height = h; c.canvas = i; bz.call(c, c, a.fn); c.clear();
                return c
            };
            k.clear = function () {
                var a = this.canvas;
                while (a.firstChild)
                    a.removeChild(a.firstChild);
                this.bottom = this.top = null;
                (this.desc = bG("desc"))[l](g.createTextNode("Created with Raphaël"));
                a[l](this.desc);
                a[l](this.defs = bG("defs"))
            };
            k.remove = function () {
                this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
                for (var a in this) this[a] = bF(a)
            }
        } if (a.vml) {
            var bW = { M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x" },
                bX = /([clmz]),?([^clmz]*)/gi, bY = / progid:\S+Blur\([^\)]+\)/g, bZ = /-?[^,\s-]+/g, b$ = 1000 + q + 1000, b_ = 10, ca = { path: 1, rect: 1 },
                cb = function (a) {
                    var b = /[ahqstv]/ig, c = bq; r(a).match(b) && (c = bw); b = /[clmz]/g;
                    if (c == bq && !r(a).match(b)) {
                        var d = r(a)[Y](bX, function (a, b, c) {
                            var d = [], e = x.call(b) == "m", f = bW[b];
                            c[Y](bZ, function (a) {
                                if (e && d[w] == 2) { f += d + bW[b == "m" ? "l" : "L"]; d = [] } d[L](Q(a * b_))
                            });
                            return f + d
                        });
                        return d
                    }
                    var e = c(a), f, g; d = [];
                    for (var h = 0, i = e[w]; h < i; h++) {
                        f = e[h]; g = x.call(e[h][0]); g == "z" && (g = "x");
                        for (var j = 1, k = f[w]; j < k; j++)
                            g += Q(f[j] * b_) + (j != k - 1 ? "," : p); d[L](g)
                    }
                    return d[v](q)
                };
            a[H] = function () {
                return "Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël " + this.version
            };
            bH = function (a, b) {
                var c = cd("group");
                c.style.cssText = "position:absolute;left:0;top:0;width:" + b.width + "px;height:" + b.height + "px"; c.coordsize = b.coordsize; c.coordorigin = b.coordorigin;
                var d = cd("shape"), e = d.style; e.width = b.width + "px"; e.height = b.height + "px"; d.coordsize = b$; d.coordorigin = b.coordorigin; c[l](d);
                var f = new bN(d, c, b), g = { fill: "none", stroke: "#000" }; a && (g.path = a); f.type = "path"; f.path = []; f.Path = p; bK(f, g); b.canvas[l](c);
                return f
            };
            bK = function (c, d) {
                c.attrs = c.attrs || {};
                var e = c.node, h = c.attrs, i = e.style, j, k = (d.x != h.x || d.y != h.y || d.width != h.width || d.height != h.height || d.r != h.r) && c.type == "rect", m = c;
                for (var n in d)
                d[f](n) && (h[n] = d[n]);
                if (k) {
                    h.path = cc(h.x, h.y, h.width, h.height, h.r); c.X = h.x; c.Y = h.y; c.W = h.width; c.H = h.height
                }
                d.href && (e.href = d.href); d.title && (e.title = d.title); d.target && (e.target = d.target); d.cursor && (i.cursor = d.cursor); "blur" in d && c.blur(d.blur);
                if (d.path && c.type == "path" || k) e.path = cb(h.path); d.rotation != null && c.rotate(d.rotation, true);
                if (d.translation) {
                    j = r(d.translation)[s](b); cz.call(c, j[0], j[1]);
                    if (c._.rt.cx != null) {
                        c._.rt.cx += +j[0]; c._.rt.cy += +j[1]; c.setBox(c.attrs, j[0], j[1])
                    }
                }
                if (d.scale) {
                    j = r(d.scale)[s](b); c.scale(+j[0] || 1, +j[1] || +j[0] || 1, +j[2] || null, +j[3] || null)
                }
                if ("clip-rect" in d) {
                    var o = r(d["clip-rect"])[s](b);
                    if (o[w] == 4) {
                        o[2] = +o[2] + +o[0]; o[3] = +o[3] + +o[1];
                        var q = e.clipRect || g.createElement("div"), t = q.style, u = e.parentNode; t.clip = a.format("rect({1}px {2}px {3}px {0}px)", o);
                        if (!e.clipRect) {
                            t.position = "absolute"; t.top = 0; t.left = 0; t.width = c.paper.width + "px"; t.height = c.paper.height + "px"; u.parentNode.insertBefore(q, u); q[l](u); e.clipRect = q
                        }
                    }
                    d["clip-rect"] || e.clipRect && (e.clipRect.style.clip = p)
                }
                c.type == "image" && d.src && (e.src = d.src);
                if (c.type == "image" && d.opacity) {
                    e.filterOpacity = U + ".Alpha(opacity=" + d.opacity * 100 + ")"; i.filter = (e.filterMatrix || p) + (e.filterOpacity || p)
                }
                d.font && (i.font = d.font); d["font-family"] && (i.fontFamily = "\"" + d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g, p) + "\"");
                d["font-size"] && (i.fontSize = d["font-size"]); d["font-weight"] && (i.fontWeight = d["font-weight"]); d["font-style"] && (i.fontStyle = d["font-style"]);
                if (d.opacity != null || d["stroke-width"] != null || d.fill != null || d.stroke != null || d["stroke-width"] != null || d["stroke-opacity"] != null || d["fill-opacity"] != null || d["stroke-dasharray"] != null || d["stroke-miterlimit"] != null || d["stroke-linejoin"] != null || d["stroke-linecap"] != null) {
                    e = c.shape || e; var v = e.getElementsByTagName(I) && e.getElementsByTagName(I)[0], x = false; !v && (x = v = cd(I));
                    if ("fill-opacity" in d || "opacity" in d) {
                        var y = ((+h["fill-opacity"] + 1 || 2) - 1) * ((+h.opacity + 1 || 2) - 1) * ((+a.getRGB(d.fill).o + 1 || 2) - 1); y = A(z(y, 0), 1); v.opacity = y
                    }
                    d.fill && (v.on = true);
                    if (v.on == null || d.fill == "none")
                    v.on = false;
                    if (v.on && d.fill) {
                        var B = d.fill.match(M);
                        if (B) {
                            v.src = B[1]; v.type = "tile"
                        } else {
                            v.color = a.getRGB(d.fill).hex; v.src = p; v.type = "solid";
                            if (a.getRGB(d.fill).error && (m.type in { circle: 1, ellipse: 1 } || r(d.fill).charAt() != "r") && bI(m, d.fill)) {
                                h.fill = "none"; h.gradient = d.fill
                            }
                        }
                    }
                    x && e[l](v);
                    var C = e.getElementsByTagName("stroke") && e.getElementsByTagName("stroke")[0], D = false; !C && (D = C = cd("stroke"));
                    if (d.stroke && d.stroke != "none" || d["stroke-width"] || d["stroke-opacity"] != null || d["stroke-dasharray"] || d["stroke-miterlimit"] || d["stroke-linejoin"] || d["stroke-linecap"])
                    C.on = true;
                    (d.stroke == "none" || C.on == null || d.stroke == 0 || d["stroke-width"] == 0) && (C.on = false);
                    var E = a.getRGB(d.stroke); C.on && d.stroke && (C.color = E.hex); y = ((+h["stroke-opacity"] + 1 || 2) - 1) * ((+h.opacity + 1 || 2) - 1) * ((+E.o + 1 || 2) - 1);
                    var F = (S(d["stroke-width"]) || 1) * 0.75; y = A(z(y, 0), 1);
                    d["stroke-width"] == null && (F = h["stroke-width"]);
                    d["stroke-width"] && (C.weight = F);
                    F && F < 1 && (y *= F) && (C.weight = 1);
                    C.opacity = y; d["stroke-linejoin"] && (C.joinstyle = d["stroke-linejoin"] || "miter");
                    C.miterlimit = d["stroke-miterlimit"] || 8; d["stroke-linecap"] && (C.endcap = d["stroke-linecap"] == "butt" ? "flat" : d["stroke-linecap"] == "square" ? "square" : "round");
                    if (d["stroke-dasharray"]) {
                        var G = {
                            "-": "shortdash",
                            ".": "shortdot",
                            "-.": "shortdashdot",
                            "-..": "shortdashdotdot",
                            ". ": "dot",
                            "- ": "dash",
                            "--": "longdash",
                            "- .": "dashdot",
                            "--.": "longdashdot",
                            "--..": "longdashdotdot"
                        };
                        C.dashstyle = G[f](d["stroke-dasharray"]) ? G[d["stroke-dasharray"]] : p
                    }
                    D && e[l](C)
                }
                if (m.type == "text") {
                    i = m.paper.span.style;
                    h.font && (i.font = h.font);
                    h["font-family"] && (i.fontFamily = h["font-family"]);
                    h["font-size"] && (i.fontSize = h["font-size"]);
                    h["font-weight"] && (i.fontWeight = h["font-weight"]);
                    h["font-style"] && (i.fontStyle = h["font-style"]);
                    m.node.string && (m.paper.span.innerHTML = r(m.node.string)[Y](/</g, "&#60;")[Y](/&/g, "&#38;")[Y](/\n/g, "<br>"));
                    m.W = h.w = m.paper.span.offsetWidth;
                    m.H = h.h = m.paper.span.offsetHeight;
                    m.X = h.x; m.Y = h.y + Q(m.H / 2);
                    switch (h["text-anchor"]) {
                        case "start": m.node.style["v-text-align"] = "left"; m.bbx = Q(m.W / 2); break;
                        case "end": m.node.style["v-text-align"] = "right"; m.bbx = -Q(m.W / 2); break;
                        default: m.node.style["v-text-align"] = "center"; break
                    }
                }
            };
            bI = function (a, b) {
                a.attrs = a.attrs || {};
                var c = a.attrs, d, e = "linear", f = ".5 .5"; a.attrs.gradient = b;
                b = r(b)[Y](bd, function (a, b, c) {
                    e = "radial";
                    if (b && c) {
                        b = S(b); c = S(c);
                        C(b - 0.5, 2) + C(c - 0.5, 2) > 0.25 && (c = y.sqrt(0.25 - C(b - 0.5, 2)) * ((c > 0.5) * 2 - 1) + 0.5);
                        f = b + q + c
                    }
                    return p
                });
                b = b[s](/\s*\-\s*/);
                if (e == "linear") {
                    var g = b.shift();
                    g = -S(g);
                    if (isNaN(g))
                        return null
                }
                var h = bx(b);
                if (!h)
                return null;
                a = a.shape || a.node; d = a.getElementsByTagName(I)[0] || cd(I); !d.parentNode && a.appendChild(d);
                if (h[w]) {
                    d.on = true;
                    d.method = "none";
                    d.color = h[0].color;
                    d.color2 = h[h[w] - 1].color;
                    var i = [];
                    for (var j = 0, k = h[w]; j < k; j++)
                        h[j].offset && i[L](h[j].offset + q + h[j].color);
                    d.colors && (d.colors.value = i[w] ? i[v]() : "0% " + d.color);
                    if (e == "radial") {
                        d.type = "gradientradial"; d.focus = "100%"; d.focussize = f; d.focusposition = f
                    } else {
                        d.type = "gradient"; d.angle = (270 - g) % 360
                    }
                }
                return 1
            };
            bN = function (b, c, d) {
                var e = 0, f = 0, g = 0, h = 1;
                this[0] = b;
                this.id = a._oid++;
                this.node = b;
                b.raphael = this; this.X = 0; this.Y = 0; this.attrs = {}; this.Group = c; this.paper = d;
                this._ = { tx: 0, ty: 0, rt: { deg: 0 }, sx: 1, sy: 1 }; !d.bottom && (d.bottom = this);
                this.prev = d.top; d.top && (d.top.next = this); d.top = this; this.next = null
            };
            bO = bN[e];
            bO.rotate = function (a, c, d) {
                if (this.removed)
                    return this;
                if (a == null) {
                    if (this._.rt.cx)
                        return [this._.rt.deg, this._.rt.cx, this._.rt.cy][v](q);
                    return this._.rt.deg
                }
                a = r(a)[s](b);
                if (a[w] - 1) {
                    c = S(a[1]); d = S(a[2])
                }
                a = S(a[0]);
                c != null ? this._.rt.deg = a : this._.rt.deg += a; d == null && (c = null);
                this._.rt.cx = c; this._.rt.cy = d; this.setBox(this.attrs, c, d);
                this.Group.style.rotation = this._.rt.deg;
                return this
            };
            bO.setBox = function (a, b, c) {
                if (this.removed)
                    return this;
                var d = this.Group.style, e = this.shape && this.shape.style || this.node.style; a = a || {};
                for (var g in a)
                a[f](g) && (this.attrs[g] = a[g]);
                b = b || this._.rt.cx; c = c || this._.rt.cy; var h = this.attrs, i, j, k, l;
                switch (this.type) {
                    case "circle": i = h.cx - h.r; j = h.cy - h.r; k = l = h.r * 2; break;
                    case "ellipse": i = h.cx - h.rx; j = h.cy - h.ry; k = h.rx * 2; l = h.ry * 2; break;
                    case "image": i = +h.x; j = +h.y; k = h.width || 0; l = h.height || 0; break;
                    case "text": this.textpath.v = ["m", Q(h.x), ", ", Q(h.y - 2), "l", Q(h.x) + 1, ", ", Q(h.y - 2)][v](p); i = h.x - Q(this.W / 2); j = h.y - this.H / 2; k = this.W; l = this.H; break;
                    case "rect":
                    case "path": if (this.attrs.path) {
                        var m = bn(this.attrs.path); i = m.x; j = m.y; k = m.width; l = m.height
                    } else {
                        i = 0; j = 0; k = this.paper.width; l = this.paper.height
                    } break;
                    default: i = 0; j = 0; k = this.paper.width; l = this.paper.height; break
                }
                b = b == null ? i + k / 2 : b;
                c = c == null ? j + l / 2 : c;
                var n = b - this.paper.width / 2, o = c - this.paper.height / 2, q; d.left != (q = n + "px") && (d.left = q); d.top != (q = o + "px") && (d.top = q);
                this.X = ca[f](this.type) ? -n : i; this.Y = ca[f](this.type) ? -o : j;
                this.W = k; this.H = l;
                if (ca[f](this.type)) {
                    e.left != (q = -n * b_ + "px") && (e.left = q); e.top != (q = -o * b_ + "px") && (e.top = q)
                } else if (this.type == "text") {
                    e.left != (q = -n + "px") && (e.left = q); e.top != (q = -o + "px") && (e.top = q)
                } else {
                    d.width != (q = this.paper.width + "px") && (d.width = q); d.height != (q = this.paper.height + "px") && (d.height = q); e.left != (q = i - n + "px") && (e.left = q); e.top != (q = j - o + "px") && (e.top = q); e.width != (q = k + "px") && (e.width = q); e.height != (q = l + "px") && (e.height = q)
                }
            };
            bO.hide = function () {
                !this.removed && (this.Group.style.display = "none");
                return this
            };
            bO.show = function () {
                !this.removed && (this.Group.style.display = "block"); return this
            };
            bO.getBBox = function () {
                if (this.removed)
                    return this;
                if (ca[f](this.type))
                    return bn(this.attrs.path);
                return { x: this.X + (this.bbx || 0), y: this.Y, width: this.W, height: this.H }
            };
            bO.remove = function () {
                if (this.removed)
                    return;
                bA(this, this.paper);
                this.node.parentNode.removeChild(this.node);
                this.Group.parentNode.removeChild(this.Group);
                this.shape && this.shape.parentNode.removeChild(this.shape);
                for (var a in this)
                    delete this[a];
                this.removed = true
            };
            bO.attr = function (b, c) {
                if (this.removed)
                    return this;
                if (b == null) {
                    var d = {};
                    for (var e in this.attrs)
                        this.attrs[f](e) && (d[e] = this.attrs[e]);
                    this._.rt.deg && (d.rotation = this.rotate());
                    (this._.sx != 1 || this._.sy != 1) && (d.scale = this.scale());
                    d.gradient && d.fill == "none" && (d.fill = d.gradient) && delete d.gradient;
                    return d
                }
                if (c == null && a.is(b, "string")) {
                    if (b == "translation")
                        return cz.call(this);
                    if (b == "rotation")
                        return this.rotate();
                    if (b == "scale")
                        return this.scale();
                    if (b == I && this.attrs.fill == "none" && this.attrs.gradient)
                        return this.attrs.gradient;
                    return this.attrs[b]
                }
                if (this.attrs && c == null && a.is(b, G)) {
                    var g, h = {};
                    for (e = 0, g = b[w]; e < g; e++)
                    h[b[e]] = this.attr(b[e]);
                return h
                }
                var i;
                if (c != null) {
                    i = {}; i[b] = c
                } c == null && a.is(b, "object") && (i = b);
                if (i) {
                    for (var j in this.paper.customAttributes)
                        if (this.paper.customAttributes[f](j) && i[f](j) && a.is(this.paper.customAttributes[j], "function")) {
                            var k = this.paper.customAttributes[j].apply(this, [][n](i[j])); this.attrs[j] = i[j];
                            for (var l in k)
                                k[f](l) && (i[l] = k[l])
                        }
                    i.text && this.type == "text" && (this.node.string = i.text);
                    bK(this, i);
                    i.gradient && (({ circle: 1, ellipse: 1 })[f](this.type) || r(i.gradient).charAt() != "r") && bI(this, i.gradient); (!ca[f](this.type) || this._.rt.deg) && this.setBox(this.attrs)
                }
                return this
            };
            bO.toFront = function () {
                !this.removed && this.Group.parentNode[l](this.Group);
                this.paper.top != this && bB(this, this.paper);
                return this
            };
            bO.toBack = function () {
                if (this.removed)
                    return this;
                if (this.Group.parentNode.firstChild != this.Group) {
                    this.Group.parentNode.insertBefore(this.Group, this.Group.parentNode.firstChild);
                    bC(this, this.paper)
                }
                return this
            };
            bO.insertAfter = function (a) {
                if (this.removed)
                    return this;
                a.constructor == cC && (a = a[a.length - 1]);
                a.Group.nextSibling ? a.Group.parentNode.insertBefore(this.Group, a.Group.nextSibling) : a.Group.parentNode[l](this.Group);
                bD(this, a, this.paper);
                return this
            };
            bO.insertBefore = function (a) {
                if (this.removed)
                    return this;
                a.constructor == cC && (a = a[0]);
                a.Group.parentNode.insertBefore(this.Group, a.Group);
                bE(this, a, this.paper);
                return this
            };
            bO.blur = function (b) {
                var c = this.node.runtimeStyle, d = c.filter; d = d.replace(bY, p);
                if (+b !== 0) {
                    this.attrs.blur = b; c.filter = d + q + U + ".Blur(pixelradius=" + (+b || 1.5) + ")"; c.margin = a.format("-{0}px 0 0 -{0}px", Q(+b || 1.5))
                } else {
                    c.filter = d; c.margin = 0; delete this.attrs.blur
                }
            };
            bP = function (a, b, c, d) {
                var e = cd("group"),
                    f = cd("oval"),
                    g = f.style;
                e.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px";
                e.coordsize = b$;
                e.coordorigin = a.coordorigin;
                e[l](f);
                var h = new bN(f, e, a);
                h.type = "circle"; bK(h, { stroke: "#000", fill: "none" });
                h.attrs.cx = b; h.attrs.cy = c; h.attrs.r = d;
                h.setBox({ x: b - d, y: c - d, width: d * 2, height: d * 2 }); a.canvas[l](e);
                return h
            };
            function cc(b, c, d, e, f) {
                return f ? a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", b + f, c, d - f * 2, f, -f, e - f * 2, f * 2 - d, f * 2 - e) : a.format("M{0},{1}l{2},0,0,{3},{4},0z", b, c, d, e, -d)
            }
            bQ = function (a, b, c, d, e, f) {
                var g = cc(b, c, d, e, f),
                    h = a.path(g),
                    i = h.attrs;
                h.X = i.x = b;
                h.Y = i.y = c;
                h.W = i.width = d;
                h.H = i.height = e;
                i.r = f;
                i.path = g;
                h.type = "rect";
                return h
            };
            bR = function (a, b, c, d, e) {
                var f = cd("group"),
                    g = cd("oval"),
                    h = g.style;
                f.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px"; f.coordsize = b$; f.coordorigin = a.coordorigin; f[l](g);
                var i = new bN(g, f, a);
                i.type = "ellipse";
                bK(i, { stroke: "#000" });
                i.attrs.cx = b; i.attrs.cy = c; i.attrs.rx = d; i.attrs.ry = e; i.setBox({ x: b - d, y: c - e, width: d * 2, height: e * 2 }); a.canvas[l](f);
                return i
            };
            bS = function (a, b, c, d, e, f) {
                var g = cd("group"), h = cd("image");
                g.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px"; g.coordsize = b$; g.coordorigin = a.coordorigin; h.src = b; g[l](h);
                var i = new bN(h, g, a); i.type = "image"; i.attrs.src = b; i.attrs.x = c; i.attrs.y = d; i.attrs.w = e; i.attrs.h = f; i.setBox({ x: c, y: d, width: e, height: f }); a.canvas[l](g);
                return i
            };
            bT = function (b, c, d, e) {
                var f = cd("group"),
                    g = cd("shape"),
                    h = g.style,
                    i = cd("path"),
                    j = i.style,
                    k = cd("textpath");
                f.style.cssText = "position:absolute;left:0;top:0;width:" + b.width + "px;height:" + b.height + "px";
                f.coordsize = b$;
                f.coordorigin = b.coordorigin;
                i.v = a.format("m{0},{1}l{2},{1}", Q(c * 10), Q(d * 10), Q(c * 10) + 1);
                i.textpathok = true;
                h.width = b.width;
                h.height = b.height;
                k.string = r(e);
                k.on = true;
                g[l](k); g[l](i); f[l](g);
                var m = new bN(k, f, b);
                m.shape = g; m.textpath = i; m.type = "text"; m.attrs.text = e; m.attrs.x = c; m.attrs.y = d; m.attrs.w = 1; m.attrs.h = 1; bK(m, { font: W.font, stroke: "none", fill: "#000" });
                m.setBox(); b.canvas[l](f);
                return m
            };
            bU = function (a, b) {
                var c = this.canvas.style;
                a == +a && (a += "px");
                b == +b && (b += "px");
                c.width = a;
                c.height = b;
                c.clip = "rect(0 " + a + " " + b + " 0)";
                return this
            };
            var cd;
            g.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
                try {
                    !g.namespaces.rvml && g.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); cd = function (a) { return g.createElement("<rvml:" + a + " class=\"rvml\">") }
            } catch (a) {
                cd = function (a) {
                    return g.createElement("<" + a + " xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")
                }
            }
                bV = function () {
                    var b = by[m](0, arguments), c = b.container, d = b.height, e, f = b.width, h = b.x, i = b.y;
                    if (!c)
                    throw new Error("VML container not found.");
                    var k = new j, n = k.canvas = g.createElement("div"), o = n.style; h = h || 0; i = i || 0; f = f || 512; d = d || 342; f == +f && (f += "px"); d == +d && (d += "px");
                    k.width = 1000; k.height = 1000; k.coordsize = b_ * 1000 + q + b_ * 1000; k.coordorigin = "0 0"; k.span = g.createElement("span");
                    k.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; n[l](k.span);
                    o.cssText = a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", f, d);
                    if (c == 1) {
                        g.body[l](n); o.left = h + "px"; o.top = i + "px"; o.position = "absolute"
                } else
                    c.firstChild ? c.insertBefore(n, c.firstChild) : c[l](n); bz.call(k, k, a.fn);
                    return k
                };
                k.clear = function () {
                    this.canvas.innerHTML = p; this.span = g.createElement("span");
                    this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; t
                    his.canvas[l](this.span);
                    this.bottom = this.top = null
                };
                k.remove = function () {
                    this.canvas.parentNode.removeChild(this.canvas);
                    for (var a in this)
                        this[a] = bF(a);
                    return true
                }
        }
        var ce = navigator.userAgent.match(/Version\\x2f(.*?)\s/);
        navigator.vendor ==
    "Apple Computer, Inc." && (ce && ce[1] < 4 || navigator.platform.slice(0, 2) == "iP") ?  k.safari = function () {  var a = this.rect(-99, -99, this.width + 99, this.height + 99).attr({ stroke: "none" }); h.setTimeout(function () { a.remove() }) } : k.safari = function () { };
        var cf = function () {
            this.returnValue = false
        },
        cg = function () {
            return this.originalEvent.preventDefault()
        },
        ch = function () {
            this.cancelBubble = true
        },
        ci = function () {
            return this.originalEvent.stopPropagation()
        },
        cj = (function () {
            {
                if (g.addEventListener)
                    return function (a, b, c, d) {
                        var e = o && u[b] ? u[b] : b, g = function (e) {
                            if (o && u[f](b))
                                for (var g = 0, h = e.targetTouches && e.targetTouches.length; g < h; g++) {
                                    if (e.targetTouches[g].target == a) {
                                        var i = e; e = e.targetTouches[g]; e.originalEvent = i; e.preventDefault = cg; e.stopPropagation = ci;
                                        break
                                    }
                                }
                            return c.call(d, e)
                        };
                        a.addEventListener(e, g, false);
                        return function () {
                            a.removeEventListener(e, g, false);
                            return true
                        }
                    };
                if (g.attachEvent)
                    return function (a, b, c, d) {
                        var e = function (a) {
                            a = a || h.event; a.preventDefault = a.preventDefault || cf; a.stopPropagation = a.stopPropagation || ch; return c.call(d, a)
                        };
                        a.attachEvent("on" + b, e);
                        var f = function () {
                            a.detachEvent("on" + b, e);
                            return true
                        };
                        return f
                    }
            }
        })(),
        ck = [],
        cl = function (a) {
            var b = a.clientX,
                c = a.clientY,
                d = g.documentElement.scrollTop || g.body.scrollTop,
                e = g.documentElement.scrollLeft || g.body.scrollLeft,
                f,
                h = ck.length;
            while (h--) {
                f = ck[h];
                if (o) {
                    var i = a.touches.length, j;
                    while (i--) {
                        j = a.touches[i];
                        if (j.identifier == f.el._drag.id) {
                            b = j.clientX; c = j.clientY; (a.originalEvent ? a.originalEvent : a).preventDefault();
                            break
                        }
                    }
                } else
                    a.preventDefault();
                b += e; c += d; f.move && f.move.call(f.move_scope || f.el, b - f.el._drag.x, c - f.el._drag.y, b, c, a)
            }
        },
        cm = function (b) {
            a.unmousemove(cl).unmouseup(cm);
            var c = ck.length, d;
            while (c--) {
                d = ck[c]; d.el._drag = {}; d.end && d.end.call(d.end_scope || d.start_scope || d.move_scope || d.el, b)
            } ck = []
        };
        for (var cn = t[w]; cn--;)
        (function (b) {
            a[b] = bN[e][b] = function (c, d) {
                if (a.is(c, "function")) {
                    this.events = this.events || []; this.events.push({ name: b, f: c, unbind: cj(this.shape || this.node || g, b, c, d || this) })
                }
                return this
            };
            a["un" + b] = bN[e]["un" + b] = function (a) {
                var c = this.events, d = c[w];
                while (d--) if (c[d].name == b && c[d].f == a) {
                    c[d].unbind(); c.splice(d, 1); !c.length && delete this.events;
                    return this
                }
                return this
            }
        })(t[cn]);
        bO.hover = function (a, b, c, d) {
            return this.mouseover(a, c).mouseout(b, d || c)
        };
        bO.unhover = function (a, b) {
            return this.unmouseover(a).unmouseout(b)
        };
        bO.drag = function (b, c, d, e, f, h) {
            this._drag = {};
            this.mousedown(function (i) {
                (i.originalEvent || i).preventDefault();
                var j = g.documentElement.scrollTop || g.body.scrollTop, k = g.documentElement.scrollLeft || g.body.scrollLeft;
                this._drag.x = i.clientX + k;
                this._drag.y = i.clientY + j;
                this._drag.id = i.identifier;
                c && c.call(f || e || this, i.clientX + k, i.clientY + j, i);
                !ck.length && a.mousemove(cl).mouseup(cm);
                ck.push({ el: this, move: b, end: d, move_scope: e, start_scope: f, end_scope: h })
            });
            return this
        };
        bO.undrag = function (b, c, d) {
            var e = ck.length;
            while (e--)
                ck[e].el == this && (ck[e].move == b && ck[e].end == d) && ck.splice(e++, 1);
            !ck.length && a.unmousemove(cl).unmouseup(cm)
        };
        k.circle = function (a, b, c) {
            return bP(this, a || 0, b || 0, c || 0)
        };
        k.rect = function (a, b, c, d, e) {
            return bQ(this, a || 0, b || 0, c || 0, d || 0, e || 0)
        };
        k.ellipse = function (a, b, c, d) {
            return bR(this, a || 0, b || 0, c || 0, d || 0)
        };
        k.path = function (b) {
            b && !a.is(b, F) && !a.is(b[0], G) && (b += p);
            return bH(a.format[m](a, arguments), this)
        };
        k.image = function (a, b, c, d, e) {
            return bS(this, a || "about:blank", b || 0, c || 0, d || 0, e || 0)
        };
        k.text = function (a, b, c) {
            return bT(this, a || 0, b || 0, r(c))
        };
        k.set = function (a) {
            arguments[w] > 1 && (a = Array[e].splice.call(arguments, 0, arguments[w]));
            return new cC(a)
        };
        k.setSize = bU;
        k.top = k.bottom = null;
        k.raphael = a;
        function co() {
            return this.x + q + this.y
        }
        bO.resetScale = function () {
            if (this.removed)
                return this;
            this._.sx = 1;
            this._.sy = 1;
            this.attrs.scale = "1 1"
        };
        bO.scale = function (a, b, c, d) {
            if (this.removed)
                return this;
            if (a == null && b == null)
                return {
                    x: this._.sx, y: this._.sy, toString: co
                };
            b = b || a; !(+b) && (b = a); var e, f, g, h, i = this.attrs;
            if (a != 0) {
                var j = this.getBBox(), k = j.x + j.width / 2, l = j.y + j.height / 2, m = B(a / this._.sx), o = B(b / this._.sy); c = +c || c == 0 ? c : k; d = +d || d == 0 ? d : l;
                var r = this._.sx > 0, s = this._.sy > 0, t = ~(~(a / B(a))), u = ~(~(b / B(b))), x = m * t, y = o * u,
                    z = this.node.style, A = c + B(k - c) * x * (k > c == r ? 1 : -1), C = d + B(l - d) * y * (l > d == s ? 1 : -1), D = a * t > b * u ? o : m;
                switch (this.type) {
                    case "rect":
                    case "image":
                        var E = i.width * m, F = i.height * o;
                        this.attr({ height: F, r: i.r * D, width: E, x: A - E / 2, y: C - F / 2 }); break;
                    case "circle":
                    case "ellipse":
                        this.attr({ rx: i.rx * m, ry: i.ry * o, r: i.r * D, cx: A, cy: C }); break;
                    case "text":
                        this.attr({ x: A, y: C }); break;
                    case "path":
                        var G = bp(i.path), H = true, I = r ? x : m, J = s ? y : o;
                        for (var K = 0, L = G[w]; K < L; K++) {
                            var M = G[K], N = V.call(M[0]); {
                                if (N == "M" && H) continue; H = false
                            }
                            if (N == "A") {
                                M[G[K][w] - 2] *= I; M[G[K][w] - 1] *= J; M[1] *= m; M[2] *= o; M[5] = +(t + u ? !(!(+M[5])) : !(+M[5]))
                            } else if (N == "H")
                                for (var O = 1, P = M[w]; O < P; O++)
                                    M[O] *= I;
                            else if (N == "V")
                                for (O = 1, P = M[w]; O < P; O++)
                                    M[O] *= J;
                            else
                                for (O = 1, P = M[w]; O < P; O++)
                                    M[O] *= O % 2 ? I : J
                        }
                        var Q = bn(G);
                        e = A - Q.x - Q.width / 2; f = C - Q.y - Q.height / 2; G[0][1] += e; G[0][2] += f;
                        this.attr({ path: G }); break
                }
                if (this.type in { text: 1, image: 1 } && (t != 1 || u != 1))
                    if (this.transformations) {
                        this.transformations[2] = "scale("[n](t, ",", u, ")");
                        this.node[R]("transform", this.transformations[v](q));
                        e = t == -1 ? -i.x - (E || 0) : i.x; f = u == -1 ? -i.y - (F || 0) : i.y;
                        this.attr({ x: e, y: f }); i.fx = t - 1; i.fy = u - 1
                    } else {
                        this.node.filterMatrix = U + ".Matrix(M11="[n](t, ", M12=0, M21=0, M22=", u, ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");
                        z.filter = (this.node.filterMatrix || p) + (this.node.filterOpacity || p)
                    } else if (this.transformations) {
                        this.transformations[2] = p;
                        this.node[R]("transform", this.transformations[v](q));
                        i.fx = 0; i.fy = 0
                    } else {
                        this.node.filterMatrix = p;
                        z.filter = (this.node.filterMatrix || p) + (this.node.filterOpacity || p)
                    } i.scale = [a, b, c, d][v](q); this._.sx = a; this._.sy = b
            } return this
        };
        bO.clone = function () {
            if (this.removed)
                return null;
            var a = this.attr();
            delete a.scale;
            delete a.translation;
            return this.paper[this.type]().attr(a)
        };
        var cp = {},
            cq = function (b, c, d, e, f, g, h, i, j) {
                var k = 0, l = 100, m = [b, c, d, e, f, g, h, i].join(), n = cp[m], o, p; !n && (cp[m] = n = { data: [] }); n.timer && clearTimeout(n.timer);
                n.timer = setTimeout(function () {
                    delete cp[m]
                }, 2000); if (j != null) {
                    var q = cq(b, c, d, e, f, g, h, i); l = ~(~q) * 10
                }
                for (var r = 0; r < l + 1; r++) {
                    if (n.data[j] > r)
                        p = n.data[r * l];
                    else {
                        p = a.findDotsAtSegment(b, c, d, e, f, g, h, i, r / l); n.data[r] = p
                    }
                    r && (k += C(C(o.x - p.x, 2) + C(o.y - p.y, 2), 0.5));
                    if (j != null && k >= j)
                        return p; o = p
                }
                if (j == null)
                    return k
            },
            cr = function (b, c) {
                return function (d, e, f) {
                    d = bw(d);
                    var g, h, i, j, k = "", l = {}, m, n = 0;
                    for (var o = 0, p = d.length; o < p; o++) {
                        i = d[o];
                        if (i[0] == "M") {
                            g = +i[1]; h = +i[2]
                        } else {
                            j = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6]);
                            if (n + j > e) {
                                if (c && !l.start) {
                                    m = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n); k += ["C", m.start.x, m.start.y, m.m.x, m.m.y, m.x, m.y];
                                    if (f)
                                        return k;
                                    l.start = k;
                                    k = ["M", m.x, m.y + "C", m.n.x, m.n.y, m.end.x, m.end.y, i[5], i[6]][v](); n += j; g = +i[5]; h = +i[6];
                                    continue
                                } if (!b && !c) {
                                    m = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n);
                                    return { x: m.x, y: m.y, alpha: m.alpha }
                                }
                            }
                            n += j; g = +i[5]; h = +i[6]
                        }
                        k += i
                    }
                    l.end = k; m = b ? n : c ? l : a.findDotsAtSegment(g, h, i[1], i[2], i[3], i[4], i[5], i[6], 1); m.alpha && (m = { x: m.x, y: m.y, alpha: m.alpha });
                    return m
                }
            },
            cs = cr(1), ct = cr(), cu = cr(0, 1);
        bO.getTotalLength = function () {
            if (this.type != "path")
                return;
            if (this.node.getTotalLength)
                return this.node.getTotalLength();
            return cs(this.attrs.path)
        };
        bO.getPointAtLength = function (a) {
            if (this.type != "path")
                return;
            return ct(this.attrs.path, a)
        };
        bO.getSubpath = function (a, b) {
            if (this.type != "path")
                return;
            if (B(this.getTotalLength() - b) < "1e-6")
                return cu(this.attrs.path, a).end;
            var c = cu(this.attrs.path, b, 1);
            return a ? cu(c, a).end : c
        };
        a.easing_formulas = {
            linear: function (a) {
                return a
            }, "<": function (a) {
                return C(a, 3)
            }, ">": function (a) {
                return C(a - 1, 3) + 1
            }, "<>": function (a) {
                a = a * 2; if (a < 1) return C(a, 3) / 2; a -= 2; return (C(a, 3) + 2) / 2
            },
            backIn: function (a) {
                var b = 1.70158;
                return a * a * ((b + 1) * a - b)
            },
            backOut: function (a) {
                a = a - 1;
                var b = 1.70158;
                return a * a * ((b + 1) * a + b) + 1
            },
            elastic: function (a) {
                if (a == 0 || a == 1)
                    return a;
                var b = 0.3, c = b / 4;
                return C(2, -10 * a) * y.sin((a - c) * (2 * D) / b) + 1
            },
            bounce: function (a) {
                var b = 7.5625,
                    c = 2.75, d;
                if (a < 1 / c)
                    d = b * a * a;
                else if (a < 2 / c) {
                        a -= 1.5 / c; d = b * a * a + 0.75
                } else if (a < 2.5 / c) {
                    a -= 2.25 / c; d = b * a * a + 0.9375
                } else {
                    a -= 2.625 / c; d = b * a * a + 0.984375
                }
                return d
            }
        };
        var cv = [],
            cw = function () {
                var b = +(new Date);
                for (var c = 0; c < cv[w]; c++) {
                    var d = cv[c];
                    if (d.stop || d.el.removed)
                        continue;
                    var e = b - d.start, g = d.ms, h = d.easing, i = d.from, j = d.diff, k = d.to, l = d.t, m = d.el, n = {}, o;
                    if (e < g) {
                        var r = h(e / g);
                        for (var s in i)
                            if (i[f](s)) {
                                switch (X[s]) {
                                    case "along":
                                        o = r * g * j[s]; k.back && (o = k.len - o);
                                        var t = ct(k[s], o);
                                        m.translate(j.sx - j.x || 0, j.sy - j.y || 0); j.x = t.x; j.y = t.y; m.translate(t.x - j.sx, t.y - j.sy); k.rot && m.rotate(j.r + t.alpha, t.x, t.y); break;
                                    case E: o = +i[s] + r * g * j[s]; break;
                                    case "colour": o = "rgb(" + [cy(Q(i[s].r + r * g * j[s].r)), cy(Q(i[s].g + r * g * j[s].g)), cy(Q(i[s].b + r * g * j[s].b))][v](",") + ")"; break;
                                    case "path":
                                        o = [];
                                        for (var u = 0, x = i[s][w]; u < x; u++) {
                                            o[u] = [i[s][u][0]];
                                            for (var y = 1, z = i[s][u][w]; y < z; y++)
                                                o[u][y] = +i[s][u][y] + r * g * j[s][u][y]; o[u] = o[u][v](q)
                                        }
                                        o = o[v](q);
                                        break;
                                    case "csv":
                                        switch (s) {
                                            case "translation":
                                                var A = r * g * j[s][0] - l.x, B = r * g * j[s][1] - l.y; l.x += A; l.y += B; o = A + q + B; break;
                                            case "rotation": o = +i[s][0] + r * g * j[s][0]; i[s][1] && (o += "," + i[s][1] + "," + i[s][2]); break;
                                            case "scale": o = [+i[s][0] + r * g * j[s][0], +i[s][1] + r * g * j[s][1], 2 in k[s] ? k[s][2] : p, 3 in k[s] ? k[s][3] : p][v](q); break;
                                            case "clip-rect": o = []; u = 4;
                                                while (u--) o[u] = +i[s][u] + r * g * j[s][u]; break
                                        } break;
                                    default:
                                        var C = [].concat(i[s]); o = []; u = m.paper.customAttributes[s].length;
                                        while (u--) o[u] = +C[u] + r * g * j[s][u];
                                        break
                                }
                                n[s] = o
                            }
                        m.attr(n);
                        m._run && m._run.call(m)
                    } else {
                        if (k.along) {
                            t = ct(k.along, k.len * !k.back);
                            m.translate(j.sx - (j.x || 0) + t.x - j.sx, j.sy - (j.y || 0) + t.y - j.sy);
                            k.rot && m.rotate(j.r + t.alpha, t.x, t.y)
                        } (l.x || l.y) && m.translate(-l.x, -l.y);
                        k.scale && (k.scale += p);
                        m.attr(k);
                        cv.splice(c--, 1)
                    }
                }
                a.svg && m && m.paper && m.paper.safari();
                cv[w] && setTimeout(cw)
            },
        cx = function (b, c, d, e, f) {
            var g = d - e;
            c.timeouts.push(setTimeout(function () {
                a.is(f, "function") && f.call(c);
                c.animate(b, g, b.easing)
            }, e))
        },
        cy = function (a) {
            return z(A(a, 255), 0)
        },
        cz = function (a, b) {
            if (a == null)
                return {
                    x: this._.tx, y: this._.ty, toString: co
                };
            this._.tx += +a;
            this._.ty += +b;
            switch (this.type) {
                case "circle":
                case "ellipse":
                    this.attr({ cx: +a + this.attrs.cx, cy: +b + this.attrs.cy }); break;
                case "rect":
                case "image":
                case "text":
                    this.attr({ x: +a + this.attrs.x, y: +b + this.attrs.y });
                    break;
                case "path":
                    var c = bp(this.attrs.path); c[0][1] += +a; c[0][2] += +b;
                    this.attr({ path: c });
                    break
            }
            return this
        };
        bO.animateWith = function (a, b, c, d, e) {
            for (var f = 0, g = cv.length; f < g; f++)
                cv[f].el.id == a.id && (b.start = cv[f].start);
            return this.animate(b, c, d, e)
        };
        bO.animateAlong = cA();
        bO.animateAlongBack = cA(1);
        function cA(b) {
            return function (c, d, e, f) {
                var g = { back: b };
                a.is(e, "function") ? f = e : g.rot = e; c && c.constructor == bN && (c = c.attrs.path); c && (g.along = c);
                return this.animate(g, d, f)
            }
        }
        function cB(a, b, c, d, e, f) {
            var g = 3 * b, h = 3 * (d - b) - g, i = 1 - g - h, j = 3 * c, k = 3 * (e - c) - j, l = 1 - j - k;
            function m(a) {
                return ((i * a + h) * a + g) * a
            }
            function n(a, b) {
                var c = o(a, b);
                return ((l * c + k) * c + j) * c
            }
            function o(a, b) {
                var c, d, e, f, j, k;
                for (e = a, k = 0; k < 8; k++) {
                    f = m(e) - a; if (B(f) < b)
                        return e;
                    j = (3 * i * e + 2 * h) * e + g;
                    if (B(j) < 0.000001) break;
                    e = e - f / j
                }
                c = 0; d = 1; e = a;
                if (e < c)
                return c;
                if (e > d)
                return d;
                while (c < d) {
                    f = m(e);
                    if (B(f - a) < b)
                        return e; a > f ? c = e : d = e; e = (d - c) / 2 + c
                }
                return e
            }
            return n(a, 1 / (200 * f))
        }
        bO.onAnimation = function (a) {
            this._run = a || 0; return this
        }; bO.animate = function (c, d, e, g) {
            var h = this; h.timeouts = h.timeouts || [];
            if (a.is(e, "function") || !e) g = e || null;
            if (h.removed) {
                g && g.call(h);
                return h
            }
            var i = {}, j = {}, k = false, l = {};
            for (var m in c)
            if (c[f](m)) {
                if (X[f](m) || h.paper.customAttributes[f](m)) {
                    k = true;
                    i[m] = h.attr(m);
                    i[m] == null && (i[m] = W[m]);
                    j[m] = c[m];
                    switch (X[m]) {
                        case "along":
                            var n = cs(c[m]),
                                o = ct(c[m],
                                n * !(!c.back)),
                                p = h.getBBox();
                            l[m] = n / d; l.tx = p.x; l.ty = p.y; l.sx = o.x; l.sy = o.y; j.rot = c.rot; j.back = c.back; j.len = n; c.rot && (l.r = S(h.rotate()) || 0); break;
                        case E: l[m] = (j[m] - i[m]) / d; break;
                        case "colour":
                            i[m] = a.getRGB(i[m]);
                            var q = a.getRGB(j[m]); l[m] = { r: (q.r - i[m].r) / d, g: (q.g - i[m].g) / d, b: (q.b - i[m].b) / d }; break;
                        case "path":
                            var t = bw(i[m], j[m]); i[m] = t[0];
                            var u = t[1]; l[m] = [];
                            for (var v = 0, x = i[m][w]; v < x; v++) {
                                l[m][v] = [0]; for (var y = 1, z = i[m][v][w]; y < z; y++) l[m][v][y] = (u[v][y] - i[m][v][y]) / d
                            } break;
                        case "csv":
                            var A = r(c[m])[s](b), B = r(i[m])[s](b);
                            switch (m) {
                                case "translation": i[m] = [0, 0]; l[m] = [A[0] / d, A[1] / d]; break;
                                case "rotation": i[m] = B[1] == A[1] && B[2] == A[2] ? B : [0, A[1], A[2]]; l[m] = [(A[0] - i[m][0]) / d, 0, 0]; break;
                                case "scale": c[m] = A; i[m] = r(i[m])[s](b); l[m] = [(A[0] - i[m][0]) / d, (A[1] - i[m][1]) / d, 0, 0]; break;
                                case "clip-rect": i[m] = r(i[m])[s](b); l[m] = []; v = 4;
                                    while (v--) l[m][v] = (A[v] - i[m][v]) / d; break
                            }
                            j[m] = A; break;
                        default: A = [].concat(c[m]);
                            B = [].concat(i[m]); l[m] = []; v = h.paper.customAttributes[m][w];
                            while (v--) l[m][v] = ((A[v] || 0) - (B[v] || 0)) / d; break
                    }
                }
            }
            if (k) {
                var G = a.easing_formulas[e];
                if (!G) {
                    G = r(e).match(P);
                    if (G && G[w] == 5) {
                        var H = G;
                        G = function (a) {
                            return cB(a, +H[1], +H[2], +H[3], +H[4], d)
                        }
                    }
                    else G = function (a) {
                        return a
                    }
                }
                cv.push({ start: c.start || +(new Date), ms: d, easing: G, from: i, diff: l, to: j, el: h, t: { x: 0, y: 0 } });
                a.is(g, "function") && (h._ac = setTimeout(function () { g.call(h) }, d));
                cv[w] == 1 && setTimeout(cw)
            } else {
                var C = [], D;
                for (var F in c)
                if (c[f](F) && Z.test(F)) {
                    m = { value: c[F] };
                    F == "from" && (F = 0); F == "to" && (F = 100); m.key = T(F, 10); C.push(m)
                }
                C.sort(be);
                C[0].key && C.unshift({ key: 0, value: h.attrs });
                for (v = 0, x = C[w]; v < x; v++)
                cx(C[v].value, h, d / 100 * C[v].key, d / 100 * (C[v - 1] && C[v - 1].key || 0), C[v - 1] && C[v - 1].value.callback);
                D = C[C[w] - 1].value.callback;
                D && h.timeouts.push(setTimeout(function () { D.call(h) }, d))
            }
            return this
        };
        bO.stop = function () {
            for (var a = 0; a < cv.length; a++)
                cv[a].el.id == this.id && cv.splice(a--, 1);
            for (a = 0, ii = this.timeouts && this.timeouts.length; a < ii; a++)
                clearTimeout(this.timeouts[a]);
            this.timeouts = [];
            clearTimeout(this._ac);
            delete this._ac;
            return this
        };
        bO.translate = function (a, b) {
            return this.attr({ translation: a + " " + b })
        };
        bO[H] = function () {
            return "Raphaël’s object"
        };
        a.ae = cv;
        var cC = function (a) {
            this.items = []; this[w] = 0; this.type = "set"; if (a) for (var b = 0, c = a[w]; b < c; b++) { if (a[b] && (a[b].constructor == bN || a[b].constructor == cC)) { this[this.items[w]] = this.items[this.items[w]] = a[b]; this[w]++ } }
        };
        cC[e][L] = function () {
            var a, b;
            for (var c = 0, d = arguments[w]; c < d; c++) {
                a = arguments[c];
                if (a && (a.constructor == bN || a.constructor == cC)) {
                    b = this.items[w];
                    this[b] = this.items[b] = a;
                    this[w]++
                }
            }
            return this
        };
        cC[e].pop = function () {
            delete this[this[w]--];
            return this.items.pop()
        };
        for (var cD in bO)
        bO[f](cD) && (cC[e][cD] = (function (a) {
            return function () {
                for (var b = 0, c = this.items[w]; b < c; b++)
                    this.items[b][a][m](this.items[b], arguments);
                return this
            }
        })(cD));
        cC[e].attr = function (b, c) {
            if (b && a.is(b, G) && a.is(b[0], "object"))
                for (var d = 0, e = b[w]; d < e; d++)
                    this.items[d].attr(b[d]);
            else
                for (var f = 0, g = this.items[w]; f < g; f++)
                    this.items[f].attr(b, c);
            return this
        };
        cC[e].animate = function (b, c, d, e) {
            (a.is(d, "function") || !d) && (e = d || null);
            var f = this.items[w], g = f, h, i = this, j;
            e && (j = function () {
                !(--f) && e.call(i)
            });
            d = a.is(d, F) ? d : j; h = this.items[--g].animate(b, c, d, j);
            while (g--)
            this.items[g] && !this.items[g].removed && this.items[g].animateWith(h, b, c, d, j);
            return this
        };
        cC[e].insertAfter = function (a) {
            var b = this.items[w];
            while (b--)
                this.items[b].insertAfter(a);
            return this
        };
        cC[e].getBBox = function () {
            var a = [], b = [], c = [], d = [];
            for (var e = this.items[w]; e--;) {
                var f = this.items[e].getBBox(); a[L](f.x); b[L](f.y); c[L](f.x + f.width); d[L](f.y + f.height)
            }
            a = A[m](0, a); b = A[m](0, b);
            return { x: a, y: b, width: z[m](0, c) - a, height: z[m](0, d) - b }
        };
        cC[e].clone = function (a) {
            a = new cC; for (var b = 0, c = this.items[w]; b < c; b++) a[L](this.items[b].clone());
            return a
        };
        a.registerFont = function (a) {
            if (!a.face)
                return a; t
                his.fonts = this.fonts || {};
                var b = { w: a.w, face: {}, glyphs: {} }, c = a.face["font-family"];
                for (var d in a.face)
                a.face[f](d) && (b.face[d] = a.face[d]);
                this.fonts[c] ? this.fonts[c][L](b) : this.fonts[c] = [b];
                if (!a.svg) {
                    b.face["units-per-em"] = T(a.face["units-per-em"], 10);
                    for (var e in a.glyphs)
                        if (a.glyphs[f](e)) {
                            var g = a.glyphs[e];
                            b.glyphs[e] = {
                                w: g.w, k: {}, d: g.d && "M" + g.d[Y](/[mlcxtrv]/g, function (a) {
                                    r
                                    eturn({ l: "L", c: "C", x: "z", t: "m", r: "l", v: "c" })[a] || "M"
                                }) + "z"
                            };
                            if (g.k)
                                for (var h in g.k)
                                    g[f](h) && (b.glyphs[e].k[h] = g.k[h])
                        }
                }
                return a
        };
        k.getFont = function (b, c, d, e) {
            e = e || "normal"; d = d || "normal"; c = +c || ({ normal: 400, bold: 700, lighter: 300, bolder: 800 })[c] || 400;
            if (!a.fonts)
                return;
            var g = a.fonts[b];
            if (!g) {
                var h = new RegExp("(^|\\s)" + b[Y](/[^\w\d\s+!~.:_-]/g, p) + "(\\s|$)", "i");
                for (var i in a.fonts)
                    if (a.fonts[f](i)) {
                        if (h.test(i)) { g = a.fonts[i]; break }
                    }
            }
            var j;
            if (g)
                for (var k = 0, l = g[w]; k < l; k++) {
                    j = g[k];
                    if (j.face["font-weight"] == c && (j.face["font-style"] == d || !j.face["font-style"]) && j.face["font-stretch"] == e)
                        break
                }
            return j
        };
        k.print = function (c, d, e, f, g, h, i) {
            h = h || "middle"; i = z(A(i || 0, 1), -1);
            var j = this.set(), k = r(e)[s](p), l = 0, m = p, n; a.is(f, e) && (f = this.getFont(f));
            if (f) {
                n = (g || 16) / f.face["units-per-em"];
                var o = f.face.bbox.split(b), q = +o[0], t = +o[1] + (h == "baseline" ? o[3] - o[1] + +f.face.descent : (o[3] - o[1]) / 2);
                for (var u = 0, v = k[w]; u < v; u++) {
                    var x = u && f.glyphs[k[u - 1]] || {}, y = f.glyphs[k[u]];
                    l += u ? (x.w || f.w) + (x.k && x.k[k[u]] || 0) + f.w * i : 0; y && y.d && j[L](this.path(y.d).attr({ fill: "#000", stroke: "none", translation: [l, 0] }))
                }
                j.scale(n, n, q, t).translate(c - q, d - t)
            }
            return j
        };
        a.format = function (b, c) {
            var e = a.is(c, G) ? [0][n](c) : arguments; b && a.is(b, F) && e[w] - 1 && (b = b[Y](d, function (a, b) { return e[++b] == null ? p : e[b] }));
            return b || p
        };
        a.ninja = function () {
            i.was ? h.Raphael = i.is : delete Raphael; return a
        };
        a.el = bO; a.st = cC[e]; i.was ? h.Raphael = a : Raphael = a
})()